diff options
author | Jordan Bracco <href@random.sh> | 2023-03-02 15:43:31 +0100 |
---|---|---|
committer | Jordan Bracco <href@random.sh> | 2023-03-02 15:43:31 +0100 |
commit | 6d9b86ab57db583187ef9d4086d58a4537a937c3 (patch) | |
tree | 0a7d5e5416825945e8b0f31f5a49b7084ca8a546 /priv/static/assets/site.js | |
parent | More fixes (diff) |
Assets update
Diffstat (limited to 'priv/static/assets/site.js')
-rw-r--r-- | priv/static/assets/site.js | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/priv/static/assets/site.js b/priv/static/assets/site.js index e0bdc79..85f8cdf 100644 --- a/priv/static/assets/site.js +++ b/priv/static/assets/site.js @@ -45,3 +45,4 @@ within: import LiveSocket from "phoenix_live_view" let liveSocket = new LiveSocket("/live", Socket, {...}) `);this.socket=new e(t,r),this.bindingPrefix=r.bindingPrefix||Zc,this.opts=r,this.params=vi(r.params||{}),this.viewLogger=r.viewLogger,this.metadataCallbacks=r.metadata||{},this.defaults=Object.assign(Mt(Kc),r.defaults||{}),this.activeElement=null,this.prevActive=null,this.silenced=!1,this.main=null,this.linkRef=1,this.roots={},this.href=window.location.href,this.pendingLink=null,this.currentLocation=Mt(window.location),this.hooks=r.hooks||{},this.uploaders=r.uploaders||{},this.loaderTimeout=r.loaderTimeout||Wc,this.localStorage=r.localStorage||window.localStorage,this.sessionStorage=r.sessionStorage||window.sessionStorage,this.boundTopLevelEvents=!1,this.domCallbacks=Object.assign({onNodeAdded:vi(),onBeforeElUpdated:vi()},r.dom||{}),window.addEventListener("pagehide",i=>{this.unloaded=!0}),this.socket.onOpen(()=>{this.isUnloaded()&&window.location.reload()})}isProfileEnabled(){return this.sessionStorage.getItem(pi)==="true"}isDebugEnabled(){return this.sessionStorage.getItem(mi)==="true"}enableDebug(){this.sessionStorage.setItem(mi,"true")}enableProfiling(){this.sessionStorage.setItem(pi,"true")}disableDebug(){this.sessionStorage.removeItem(mi)}disableProfiling(){this.sessionStorage.removeItem(pi)}enableLatencySim(t){this.enableDebug(),console.log("latency simulator enabled for the duration of this browser session. Call disableLatencySim() to disable"),this.sessionStorage.setItem(gi,t)}disableLatencySim(){this.sessionStorage.removeItem(gi)}getLatencySim(){let t=this.sessionStorage.getItem(gi);return t?parseInt(t):null}getSocket(){return this.socket}connect(){let t=()=>{this.joinRootViews()&&(this.bindTopLevelEvents(),this.socket.connect())};["complete","loaded","interactive"].indexOf(document.readyState)>=0?t():document.addEventListener("DOMContentLoaded",()=>t())}disconnect(t){this.socket.disconnect(t)}triggerDOM(t,e){this.domCallbacks[t](...e)}time(t,e){if(!this.isProfileEnabled()||!console.time)return e();console.time(t);let r=e();return console.timeEnd(t),r}log(t,e,r){if(this.viewLogger){let[i,n]=r();this.viewLogger(t,e,i,n)}else if(this.isDebugEnabled()){let[i,n]=r();Xc(t,e,i,n)}}onChannel(t,e,r){t.on(e,i=>{let n=this.getLatencySim();n?(console.log(`simulating ${n}ms of latency from server to client`),setTimeout(()=>r(i),n)):r(i)})}wrapPush(t,e,r){let i=this.getLatencySim(),n=t.joinCount;if(!i)return e.timeout?r().receive("timeout",()=>{t.joinCount===n&&!t.isDestroyed()&&this.reloadWithJitter(t,()=>{this.log(t,"timeout",()=>["received timeout while communicating with server. Falling back to hard refresh for recovery"])})}):r();console.log(`simulating ${i}ms of latency from client to server`);let s={receives:[],receive(o,a){this.receives.push([o,a])}};return setTimeout(()=>{t.isDestroyed()||s.receives.reduce((o,[a,l])=>o.receive(a,l),r())},i),s}reloadWithJitter(t,e){t.destroy(),this.disconnect();let[r,i]=xc,n=Math.floor(Math.random()*(i-r+1))+r,s=Me.updateLocal(this.localStorage,window.location.pathname,po,0,o=>o+1);e?e():this.log(t,"join",()=>[`encountered ${s} consecutive reloads`]),s>go&&(this.log(t,"join",()=>[`exceeded ${go} consecutive reloads. Entering failsafe mode`]),n=Nc),setTimeout(()=>{this.hasPendingLink()?window.location=this.pendingLink:window.location.reload()},n)}getHookCallbacks(t){return t&&t.startsWith("Phoenix.")?ih[t.split(".")[1]]:this.hooks[t]}isUnloaded(){return this.unloaded}isConnected(){return this.socket.isConnected()}getBindingPrefix(){return this.bindingPrefix}binding(t){return`${this.getBindingPrefix()}${t}`}channel(t,e){return this.socket.channel(t,e)}joinRootViews(){let t=!1;return g.all(document,`${lt}:not([${Lt}])`,e=>{if(!this.getRootById(e.id)){let r=this.newRootView(e);r.setHref(this.getHref()),r.join(),e.getAttribute(Ao)&&(this.main=r)}t=!0}),t}redirect(t,e){this.disconnect(),Me.redirect(t,e)}replaceMain(t,e,r=null,i=this.setPendingLink(t)){let n=this.main.el,s=g.cloneNode(n,"");this.main.showLoader(this.loaderTimeout),this.main.destroy(),this.main=this.newRootView(s,e),this.main.setRedirect(t),this.main.join(o=>{o===1&&this.commitPendingLink(i)&&(n.replaceWith(s),r&&r())})}isPhxView(t){return t.getAttribute&&t.getAttribute(Pe)!==null}newRootView(t,e){let r=new $o(t,this,null,e);return this.roots[r.id]=r,r}owner(t,e){let r=ye(t.closest(lt),i=>this.getViewByEl(i));r&&e(r)}withinOwners(t,e){this.owner(t,r=>{let i=t.getAttribute(this.binding("target"));i===null?e(r,t):r.withinTargets(i,e)})}getViewByEl(t){let e=t.getAttribute(hr);return ye(this.getRootById(e),r=>r.getDescendentByEl(t))}getRootById(t){return this.roots[t]}destroyAllViews(){for(let t in this.roots)this.roots[t].destroy(),delete this.roots[t]}destroyViewByEl(t){let e=this.getRootById(t.getAttribute(hr));e&&e.destroyDescendent(t.id)}setActiveElement(t){if(this.activeElement===t)return;this.activeElement=t;let e=()=>{t===this.activeElement&&(this.activeElement=null),t.removeEventListener("mouseup",this),t.removeEventListener("touchend",this)};t.addEventListener("mouseup",e),t.addEventListener("touchend",e)}getActiveElement(){return document.activeElement===document.body?this.activeElement||document.activeElement:document.activeElement||document.body}dropActiveElement(t){this.prevActive&&t.ownsElement(this.prevActive)&&(this.prevActive=null)}restorePreviouslyActiveFocus(){this.prevActive&&this.prevActive!==document.body&&this.prevActive.focus()}blurActiveElement(){this.prevActive=this.getActiveElement(),this.prevActive!==document.body&&this.prevActive.blur()}bindTopLevelEvents(){this.boundTopLevelEvents||(this.boundTopLevelEvents=!0,document.body.addEventListener("click",function(){}),window.addEventListener("pageshow",t=>{t.persisted&&(this.getSocket().disconnect(),this.withPageLoading({to:window.location.href,kind:"redirect"}),window.location.reload())},!0),this.bindNav(),this.bindClicks(),this.bindForms(),this.bind({keyup:"keyup",keydown:"keydown"},(t,e,r,i,n,s,o)=>{let a=i.getAttribute(this.binding(qc)),l=t.key&&t.key.toLowerCase();a&&a.toLowerCase()!==l||r.pushKey(i,n,e,s,{key:t.key,...this.eventMeta(e,t,i)})}),this.bind({blur:"focusout",focus:"focusin"},(t,e,r,i,n,s,o)=>{o||r.pushEvent(e,i,n,s,this.eventMeta(e,t,i))}),this.bind({blur:"blur",focus:"focus"},(t,e,r,i,n,s,o)=>{o&&!o!=="window"&&r.pushEvent(e,i,n,s,this.eventMeta(e,t,i))}),window.addEventListener("dragover",t=>t.preventDefault()),window.addEventListener("drop",t=>{t.preventDefault();let e=ye(Rt(t.target,this.binding(bo)),n=>n.getAttribute(this.binding(bo))),r=e&&document.getElementById(e),i=Array.from(t.dataTransfer.files||[]);!r||r.disabled||i.length===0||!(r.files instanceof FileList)||(D.trackFiles(r,i),r.dispatchEvent(new Event("input",{bubbles:!0})))}),this.on(yo,t=>{let e=t.target;if(!g.isUploadInput(e))return;let r=Array.from(t.detail.files||[]).filter(i=>i instanceof File||i instanceof Blob);D.trackFiles(e,r),e.dispatchEvent(new Event("input",{bubbles:!0}))}))}eventMeta(t,e,r){let i=this.metadataCallbacks[t];return i?i(e,r):{}}setPendingLink(t){return this.linkRef++,this.pendingLink=t,this.linkRef}commitPendingLink(t){return this.linkRef!==t?!1:(this.href=this.pendingLink,this.pendingLink=null,!0)}getHref(){return this.href}hasPendingLink(){return!!this.pendingLink}bind(t,e){for(let r in t){let i=t[r];this.on(i,n=>{let s=this.binding(r),o=this.binding(`window-${r}`),a=n.target.getAttribute&&n.target.getAttribute(s);a?this.debounce(n.target,n,()=>{this.withinOwners(n.target,(l,u)=>{e(n,r,l,n.target,u,a,null)})}):g.all(document,`[${o}]`,l=>{let u=l.getAttribute(o);this.debounce(l,n,()=>{this.withinOwners(l,(c,h)=>{e(n,r,c,l,h,u,"window")})})})})}}bindClicks(){this.bindClick("click","click",!1),this.bindClick("mousedown","capture-click",!0)}bindClick(t,e,r){let i=this.binding(e);window.addEventListener(t,n=>{if(!this.isConnected())return;let s=null;r?s=n.target.matches(`[${i}]`)?n.target:n.target.querySelector(`[${i}]`):s=Rt(n.target,i);let o=s&&s.getAttribute(i);!o||(s.getAttribute("href")==="#"&&n.preventDefault(),this.debounce(s,n,()=>{this.withinOwners(s,(a,l)=>{a.pushEvent("click",s,l,o,this.eventMeta("click",n,s))})}))},r)}bindNav(){if(!Me.canPushState())return;history.scrollRestoration&&(history.scrollRestoration="manual");let t=null;window.addEventListener("scroll",e=>{clearTimeout(t),t=setTimeout(()=>{Me.updateCurrentState(r=>Object.assign(r,{scroll:window.scrollY}))},100)}),window.addEventListener("popstate",e=>{if(!this.registerNewLocation(window.location))return;let{type:r,id:i,root:n,scroll:s}=e.state||{},o=window.location.href;this.main.isConnected()&&r==="patch"&&i===this.main.id?this.main.pushLinkPatch(o,null):this.replaceMain(o,null,()=>{n&&this.replaceRootHistory(),typeof s=="number"&&setTimeout(()=>{window.scrollTo(0,s)},0)})},!1),window.addEventListener("click",e=>{let r=Rt(e.target,oi),i=r&&r.getAttribute(oi),n=e.metaKey||e.ctrlKey||e.button===1;if(!i||!this.isConnected()||!this.main||n)return;let s=r.href,o=r.getAttribute(Fc);if(e.preventDefault(),this.pendingLink!==s)if(i==="patch")this.pushHistoryPatch(s,o,r);else if(i==="redirect")this.historyRedirect(s,o);else throw new Error(`expected ${oi} to be "patch" or "redirect", got: ${i}`)},!1)}withPageLoading(t,e){g.dispatchEvent(window,"phx:page-loading-start",t);let r=()=>g.dispatchEvent(window,"phx:page-loading-stop",t);return e?e(r):r}pushHistoryPatch(t,e,r){this.withPageLoading({to:t,kind:"patch"},i=>{this.main.pushLinkPatch(t,r,n=>{this.historyPatch(t,e,n),i()})})}historyPatch(t,e,r=this.setPendingLink(t)){!this.commitPendingLink(r)||(Me.pushState(e,{type:"patch",id:this.main.id},t),this.registerNewLocation(window.location))}historyRedirect(t,e,r){let i=window.scrollY;this.withPageLoading({to:t,kind:"redirect"},n=>{this.replaceMain(t,r,()=>{Me.pushState(e,{type:"redirect",id:this.main.id,scroll:i},t),this.registerNewLocation(window.location),n()})})}replaceRootHistory(){Me.pushState("replace",{root:!0,type:"patch",id:this.main.id})}registerNewLocation(t){let{pathname:e,search:r}=this.currentLocation;return e+r===t.pathname+t.search?!1:(this.currentLocation=Mt(t),!0)}bindForms(){let t=0;this.on("submit",e=>{let r=e.target.getAttribute(this.binding("submit"));!r||(e.preventDefault(),e.target.disabled=!0,this.withinOwners(e.target,(i,n)=>i.submitForm(e.target,n,r)))},!1);for(let e of["change","input"])this.on(e,r=>{let i=r.target,n=i.form&&i.form.getAttribute(this.binding("change"));if(!n||i.type==="number"&&i.validity&&i.validity.badInput)return;let s=t;t++;let{at:o,type:a}=g.private(i,"prev-iteration")||{};o===s-1&&e!==a||(g.putPrivate(i,"prev-iteration",{at:s,type:e}),this.debounce(i,r,()=>{this.withinOwners(i.form,(l,u)=>{g.putPrivate(i,Co,!0),g.isTextualInput(i)||this.setActiveElement(i),l.pushInput(i,u,n,r.target)})}))},!1)}debounce(t,e,r){let i=this.binding(jc),n=this.binding(Uc),s=this.defaults.debounce.toString(),o=this.defaults.throttle.toString();g.debounce(t,e,i,s,n,o,r)}silenceEvents(t){this.silenced=!0,t(),this.silenced=!1}on(t,e){window.addEventListener(t,r=>{this.silenced||e(r)})}};var Si=ki(ii()),wh=Rr.start();wh.load(co);var Ei={};Ei.AutoFocus={mounted(){this.el.focus()}};Ei.NaiveDateTimeUTC={mounted(){var t=Intl.DateTimeFormat().resolvedOptions(),e=document.body.dataset.tz||t.timeZone||"UTC",r=document.body.dataset.locale||t.locale||"en",i=Si.DateTime[this.el.dataset.timeFormat],n=Si.DateTime.fromISO(this.el.dateTime,{zone:"utc"}).setZone(e).setLocale(r);this.el.innerText=n.toLocaleString(i)}};var Sh=document.querySelector("meta[name='csrf-token']").getAttribute("content"),Eh=new Wo("/live",mo,{hooks:Ei,params:{_csrf_token:Sh}});Eh.connect();})(); +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9sdXhvbi9zcmMvZXJyb3JzLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvbHV4b24vc3JjL2ltcGwvZm9ybWF0cy5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL3V0aWwuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW1wbC9lbmdsaXNoLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvbHV4b24vc3JjL2ltcGwvZm9ybWF0dGVyLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvbHV4b24vc3JjL2ltcGwvaW52YWxpZC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2x1eG9uL3NyYy96b25lLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvbHV4b24vc3JjL3pvbmVzL3N5c3RlbVpvbmUuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9sdXhvbi9zcmMvem9uZXMvSUFOQVpvbmUuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9sdXhvbi9zcmMvem9uZXMvZml4ZWRPZmZzZXRab25lLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvbHV4b24vc3JjL3pvbmVzL2ludmFsaWRab25lLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvbHV4b24vc3JjL2ltcGwvem9uZVV0aWwuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9sdXhvbi9zcmMvc2V0dGluZ3MuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW1wbC9sb2NhbGUuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW1wbC9yZWdleFBhcnNlci5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9kdXJhdGlvbi5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbnRlcnZhbC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbmZvLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvbHV4b24vc3JjL2ltcGwvZGlmZi5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL2RpZ2l0cy5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL3Rva2VuUGFyc2VyLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvbHV4b24vc3JjL2ltcGwvY29udmVyc2lvbnMuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9sdXhvbi9zcmMvZGF0ZXRpbWUuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9sdXhvbi9zcmMvbHV4b24uanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AaG90d2lyZWQvdHVyYm8vZGlzdC90dXJiby5lczIwMTctZXNtLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL2NvcmUvc3JjL2V2ZW50X2xpc3RlbmVyLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL2NvcmUvc3JjL2Rpc3BhdGNoZXIudHMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9Ac3RpbXVsdXMvY29yZS9zcmMvYWN0aW9uX2Rlc2NyaXB0b3IudHMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9Ac3RpbXVsdXMvY29yZS9zcmMvYWN0aW9uLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL2NvcmUvc3JjL2JpbmRpbmcudHMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9Ac3RpbXVsdXMvbXV0YXRpb24tb2JzZXJ2ZXJzL3NyYy9lbGVtZW50X29ic2VydmVyLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL211dGF0aW9uLW9ic2VydmVycy9zcmMvYXR0cmlidXRlX29ic2VydmVyLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL211dGF0aW9uLW9ic2VydmVycy9zcmMvc3RyaW5nX21hcF9vYnNlcnZlci50cyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0BzdGltdWx1cy9tdWx0aW1hcC9zcmMvc2V0X29wZXJhdGlvbnMudHMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9Ac3RpbXVsdXMvbXVsdGltYXAvc3JjL211bHRpbWFwLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL211bHRpbWFwL3NyYy9pbmRleGVkX211bHRpbWFwLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL211dGF0aW9uLW9ic2VydmVycy9zcmMvdG9rZW5fbGlzdF9vYnNlcnZlci50cyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0BzdGltdWx1cy9tdXRhdGlvbi1vYnNlcnZlcnMvc3JjL3ZhbHVlX2xpc3Rfb2JzZXJ2ZXIudHMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9Ac3RpbXVsdXMvY29yZS9zcmMvYmluZGluZ19vYnNlcnZlci50cyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0BzdGltdWx1cy9jb3JlL3NyYy92YWx1ZV9vYnNlcnZlci50cyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0BzdGltdWx1cy9jb3JlL3NyYy9jb250ZXh0LnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL2NvcmUvc3JjL2luaGVyaXRhYmxlX3N0YXRpY3MudHMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9Ac3RpbXVsdXMvY29yZS9zcmMvYmxlc3NpbmcudHMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9Ac3RpbXVsdXMvY29yZS9zcmMvZGVmaW5pdGlvbi50cyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0BzdGltdWx1cy9jb3JlL3NyYy9tb2R1bGUudHMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9Ac3RpbXVsdXMvY29yZS9zcmMvY2xhc3NfbWFwLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL2NvcmUvc3JjL3N0cmluZ19oZWxwZXJzLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL2NvcmUvc3JjL2RhdGFfbWFwLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL2NvcmUvc3JjL2d1aWRlLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL2NvcmUvc3JjL3NlbGVjdG9ycy50cyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0BzdGltdWx1cy9jb3JlL3NyYy90YXJnZXRfc2V0LnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL2NvcmUvc3JjL3Njb3BlLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL2NvcmUvc3JjL3Njb3BlX29ic2VydmVyLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL2NvcmUvc3JjL3JvdXRlci50cyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0BzdGltdWx1cy9jb3JlL3NyYy9zY2hlbWEudHMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9Ac3RpbXVsdXMvY29yZS9zcmMvYXBwbGljYXRpb24udHMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9Ac3RpbXVsdXMvY29yZS9zcmMvY2xhc3NfcHJvcGVydGllcy50cyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0BzdGltdWx1cy9jb3JlL3NyYy90YXJnZXRfcHJvcGVydGllcy50cyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0BzdGltdWx1cy9jb3JlL3NyYy92YWx1ZV9wcm9wZXJ0aWVzLnRzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHN0aW11bHVzL2NvcmUvc3JjL2NvbnRyb2xsZXIudHMiLCAiLi4vLi4vLi4vYXNzZXRzL2NvbnRyb2xsZXJzL3RpbWVfY29udHJvbGxlci5qcyIsICJzdGltdWx1c19uczovVXNlcnMvaHJlZi9kZXYvbm9sYS9hc3NldHMvY29udHJvbGxlcnMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3V0aWxzLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9jb25zdGFudHMuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3B1c2guanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3RpbWVyLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9jaGFubmVsLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9hamF4LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9sb25ncG9sbC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL3Bob2VuaXgvYXNzZXRzL2pzL3Bob2VuaXgvcHJlc2VuY2UuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3NlcmlhbGl6ZXIuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3NvY2tldC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9jb25zdGFudHMuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvZW50cnlfdXBsb2FkZXIuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdXRpbHMuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvYnJvd3Nlci5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9kb20uanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdXBsb2FkX2VudHJ5LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L2xpdmVfdXBsb2FkZXIuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvaG9va3MuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvZG9tX3Bvc3RfbW9ycGhfcmVzdG9yZXIuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvbm9kZV9tb2R1bGVzL21vcnBoZG9tL2Rpc3QvbW9ycGhkb20tZXNtLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L2RvbV9wYXRjaC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9yZW5kZXJlZC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy92aWV3X2hvb2suanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdmlldy5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9saXZlX3NvY2tldC5qcyIsICIuLi8uLi8uLi9hc3NldHMvc2l0ZS5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLy8gdGhlc2UgYXJlbid0IHJlYWxseSBwcml2YXRlLCBidXQgbm9yIGFyZSB0aGV5IHJlYWxseSB1c2VmdWwgdG8gZG9jdW1lbnRcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBMdXhvbkVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZERhdGVUaW1lRXJyb3IgZXh0ZW5kcyBMdXhvbkVycm9yIHtcbiAgY29uc3RydWN0b3IocmVhc29uKSB7XG4gICAgc3VwZXIoYEludmFsaWQgRGF0ZVRpbWU6ICR7cmVhc29uLnRvTWVzc2FnZSgpfWApO1xuICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWRJbnRlcnZhbEVycm9yIGV4dGVuZHMgTHV4b25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKHJlYXNvbikge1xuICAgIHN1cGVyKGBJbnZhbGlkIEludGVydmFsOiAke3JlYXNvbi50b01lc3NhZ2UoKX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkRHVyYXRpb25FcnJvciBleHRlbmRzIEx1eG9uRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihyZWFzb24pIHtcbiAgICBzdXBlcihgSW52YWxpZCBEdXJhdGlvbjogJHtyZWFzb24udG9NZXNzYWdlKCl9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IgZXh0ZW5kcyBMdXhvbkVycm9yIHt9XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWRVbml0RXJyb3IgZXh0ZW5kcyBMdXhvbkVycm9yIHtcbiAgY29uc3RydWN0b3IodW5pdCkge1xuICAgIHN1cGVyKGBJbnZhbGlkIHVuaXQgJHt1bml0fWApO1xuICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWRBcmd1bWVudEVycm9yIGV4dGVuZHMgTHV4b25FcnJvciB7fVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBab25lSXNBYnN0cmFjdEVycm9yIGV4dGVuZHMgTHV4b25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiWm9uZSBpcyBhbiBhYnN0cmFjdCBjbGFzc1wiKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5jb25zdCBuID0gXCJudW1lcmljXCIsXG4gIHMgPSBcInNob3J0XCIsXG4gIGwgPSBcImxvbmdcIjtcblxuZXhwb3J0IGNvbnN0IERBVEVfU0hPUlQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBuLFxuICBkYXk6IG4sXG59O1xuXG5leHBvcnQgY29uc3QgREFURV9NRUQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBzLFxuICBkYXk6IG4sXG59O1xuXG5leHBvcnQgY29uc3QgREFURV9NRURfV0lUSF9XRUVLREFZID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogcyxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBzLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVfRlVMTCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogbixcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFX0hVR0UgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG4gIHdlZWtkYXk6IGwsXG59O1xuXG5leHBvcnQgY29uc3QgVElNRV9TSU1QTEUgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbn07XG5cbmV4cG9ydCBjb25zdCBUSU1FX1dJVEhfU0VDT05EUyA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICBzZWNvbmQ6IG4sXG59O1xuXG5leHBvcnQgY29uc3QgVElNRV9XSVRIX1NIT1JUX09GRlNFVCA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICBzZWNvbmQ6IG4sXG4gIHRpbWVab25lTmFtZTogcyxcbn07XG5cbmV4cG9ydCBjb25zdCBUSU1FX1dJVEhfTE9OR19PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxuICB0aW1lWm9uZU5hbWU6IGwsXG59O1xuXG5leHBvcnQgY29uc3QgVElNRV8yNF9TSU1QTEUgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgaG91ckN5Y2xlOiBcImgyM1wiLFxufTtcblxuZXhwb3J0IGNvbnN0IFRJTUVfMjRfV0lUSF9TRUNPTkRTID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHNlY29uZDogbixcbiAgaG91ckN5Y2xlOiBcImgyM1wiLFxufTtcblxuZXhwb3J0IGNvbnN0IFRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxuICBob3VyQ3ljbGU6IFwiaDIzXCIsXG4gIHRpbWVab25lTmFtZTogcyxcbn07XG5cbmV4cG9ydCBjb25zdCBUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxuICBob3VyQ3ljbGU6IFwiaDIzXCIsXG4gIHRpbWVab25lTmFtZTogbCxcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFVElNRV9TSE9SVCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IG4sXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUyA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IG4sXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICBzZWNvbmQ6IG4sXG59O1xuXG5leHBvcnQgY29uc3QgREFURVRJTUVfTUVEID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogcyxcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG59O1xuXG5leHBvcnQgY29uc3QgREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUyA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IHMsXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICBzZWNvbmQ6IG4sXG59O1xuXG5leHBvcnQgY29uc3QgREFURVRJTUVfTUVEX1dJVEhfV0VFS0RBWSA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IHMsXG4gIGRheTogbixcbiAgd2Vla2RheTogcyxcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVUSU1FX0ZVTEwgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgdGltZVpvbmVOYW1lOiBzLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHNlY29uZDogbixcbiAgdGltZVpvbmVOYW1lOiBzLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVUSU1FX0hVR0UgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG4gIHdlZWtkYXk6IGwsXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgdGltZVpvbmVOYW1lOiBsLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBsLFxuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHNlY29uZDogbixcbiAgdGltZVpvbmVOYW1lOiBsLFxufTtcbiIsICIvKlxuICBUaGlzIGlzIGp1c3QgYSBqdW5rIGRyYXdlciwgY29udGFpbmluZyBhbnl0aGluZyB1c2VkIGFjcm9zcyBtdWx0aXBsZSBjbGFzc2VzLlxuICBCZWNhdXNlIEx1eG9uIGlzIHNtYWxsKGlzaCksIHRoaXMgc2hvdWxkIHN0YXkgc21hbGwgYW5kIHdlIHdvbid0IHdvcnJ5IGFib3V0IHNwbGl0dGluZ1xuICBpdCB1cCBpbnRvLCBzYXksIHBhcnNpbmdVdGlsLmpzIGFuZCBiYXNpY1V0aWwuanMgYW5kIHNvIG9uLiBCdXQgdGhleSBhcmUgZGl2aWRlZCB1cCBieSBmZWF0dXJlIGFyZWEuXG4qL1xuXG5pbXBvcnQgeyBJbnZhbGlkQXJndW1lbnRFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMuanNcIjtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8vIFRZUEVTXG5cbmV4cG9ydCBmdW5jdGlvbiBpc1VuZGVmaW5lZChvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gXCJ1bmRlZmluZWRcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSBcIm51bWJlclwiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJbnRlZ2VyKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSBcIm51bWJlclwiICYmIG8gJSAxID09PSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcobykge1xuICByZXR1cm4gdHlwZW9mIG8gPT09IFwic3RyaW5nXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGUobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSBcIltvYmplY3QgRGF0ZV1cIjtcbn1cblxuLy8gQ0FQQUJJTElUSUVTXG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNSZWxhdGl2ZSgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdHlwZW9mIEludGwgIT09IFwidW5kZWZpbmVkXCIgJiYgISFJbnRsLlJlbGF0aXZlVGltZUZvcm1hdDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vLyBPQkpFQ1RTIEFORCBBUlJBWVNcblxuZXhwb3J0IGZ1bmN0aW9uIG1heWJlQXJyYXkodGhpbmcpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpbmcpID8gdGhpbmcgOiBbdGhpbmddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmVzdEJ5KGFyciwgYnksIGNvbXBhcmUpIHtcbiAgaWYgKGFyci5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBhcnIucmVkdWNlKChiZXN0LCBuZXh0KSA9PiB7XG4gICAgY29uc3QgcGFpciA9IFtieShuZXh0KSwgbmV4dF07XG4gICAgaWYgKCFiZXN0KSB7XG4gICAgICByZXR1cm4gcGFpcjtcbiAgICB9IGVsc2UgaWYgKGNvbXBhcmUoYmVzdFswXSwgcGFpclswXSkgPT09IGJlc3RbMF0pIHtcbiAgICAgIHJldHVybiBiZXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcGFpcjtcbiAgICB9XG4gIH0sIG51bGwpWzFdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGljayhvYmosIGtleXMpIHtcbiAgcmV0dXJuIGtleXMucmVkdWNlKChhLCBrKSA9PiB7XG4gICAgYVtrXSA9IG9ialtrXTtcbiAgICByZXR1cm4gYTtcbiAgfSwge30pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cblxuLy8gTlVNQkVSUyBBTkQgU1RSSU5HU1xuXG5leHBvcnQgZnVuY3Rpb24gaW50ZWdlckJldHdlZW4odGhpbmcsIGJvdHRvbSwgdG9wKSB7XG4gIHJldHVybiBpc0ludGVnZXIodGhpbmcpICYmIHRoaW5nID49IGJvdHRvbSAmJiB0aGluZyA8PSB0b3A7XG59XG5cbi8vIHggJSBuIGJ1dCB0YWtlcyB0aGUgc2lnbiBvZiBuIGluc3RlYWQgb2YgeFxuZXhwb3J0IGZ1bmN0aW9uIGZsb29yTW9kKHgsIG4pIHtcbiAgcmV0dXJuIHggLSBuICogTWF0aC5mbG9vcih4IC8gbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYWRTdGFydChpbnB1dCwgbiA9IDIpIHtcbiAgY29uc3QgbWludXMgPSBpbnB1dCA8IDAgPyBcIi1cIiA6IFwiXCI7XG4gIGNvbnN0IHRhcmdldCA9IG1pbnVzID8gaW5wdXQgKiAtMSA6IGlucHV0O1xuICBsZXQgcmVzdWx0O1xuXG4gIGlmICh0YXJnZXQudG9TdHJpbmcoKS5sZW5ndGggPCBuKSB7XG4gICAgcmVzdWx0ID0gKFwiMFwiLnJlcGVhdChuKSArIHRhcmdldCkuc2xpY2UoLW4pO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IHRhcmdldC50b1N0cmluZygpO1xuICB9XG5cbiAgcmV0dXJuIGAke21pbnVzfSR7cmVzdWx0fWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUludGVnZXIoc3RyaW5nKSB7XG4gIGlmIChpc1VuZGVmaW5lZChzdHJpbmcpIHx8IHN0cmluZyA9PT0gbnVsbCB8fCBzdHJpbmcgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBwYXJzZUludChzdHJpbmcsIDEwKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VNaWxsaXMoZnJhY3Rpb24pIHtcbiAgLy8gUmV0dXJuIHVuZGVmaW5lZCAoaW5zdGVhZCBvZiAwKSBpbiB0aGVzZSBjYXNlcywgd2hlcmUgZnJhY3Rpb24gaXMgbm90IHNldFxuICBpZiAoaXNVbmRlZmluZWQoZnJhY3Rpb24pIHx8IGZyYWN0aW9uID09PSBudWxsIHx8IGZyYWN0aW9uID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBmID0gcGFyc2VGbG9hdChcIjAuXCIgKyBmcmFjdGlvbikgKiAxMDAwO1xuICAgIHJldHVybiBNYXRoLmZsb29yKGYpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByb3VuZFRvKG51bWJlciwgZGlnaXRzLCB0b3dhcmRaZXJvID0gZmFsc2UpIHtcbiAgY29uc3QgZmFjdG9yID0gMTAgKiogZGlnaXRzLFxuICAgIHJvdW5kZXIgPSB0b3dhcmRaZXJvID8gTWF0aC50cnVuYyA6IE1hdGgucm91bmQ7XG4gIHJldHVybiByb3VuZGVyKG51bWJlciAqIGZhY3RvcikgLyBmYWN0b3I7XG59XG5cbi8vIERBVEUgQkFTSUNTXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xlYXBZZWFyKHllYXIpIHtcbiAgcmV0dXJuIHllYXIgJSA0ID09PSAwICYmICh5ZWFyICUgMTAwICE9PSAwIHx8IHllYXIgJSA0MDAgPT09IDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGF5c0luWWVhcih5ZWFyKSB7XG4gIHJldHVybiBpc0xlYXBZZWFyKHllYXIpID8gMzY2IDogMzY1O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGF5c0luTW9udGgoeWVhciwgbW9udGgpIHtcbiAgY29uc3QgbW9kTW9udGggPSBmbG9vck1vZChtb250aCAtIDEsIDEyKSArIDEsXG4gICAgbW9kWWVhciA9IHllYXIgKyAobW9udGggLSBtb2RNb250aCkgLyAxMjtcblxuICBpZiAobW9kTW9udGggPT09IDIpIHtcbiAgICByZXR1cm4gaXNMZWFwWWVhcihtb2RZZWFyKSA/IDI5IDogMjg7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFszMSwgbnVsbCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdW21vZE1vbnRoIC0gMV07XG4gIH1cbn1cblxuLy8gY292ZXJ0IGEgY2FsZW5kYXIgb2JqZWN0IHRvIGEgbG9jYWwgdGltZXN0YW1wIChlcG9jaCwgYnV0IHdpdGggdGhlIG9mZnNldCBiYWtlZCBpbilcbmV4cG9ydCBmdW5jdGlvbiBvYmpUb0xvY2FsVFMob2JqKSB7XG4gIGxldCBkID0gRGF0ZS5VVEMoXG4gICAgb2JqLnllYXIsXG4gICAgb2JqLm1vbnRoIC0gMSxcbiAgICBvYmouZGF5LFxuICAgIG9iai5ob3VyLFxuICAgIG9iai5taW51dGUsXG4gICAgb2JqLnNlY29uZCxcbiAgICBvYmoubWlsbGlzZWNvbmRcbiAgKTtcblxuICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMsIHllYXJzIGJldHdlZW4gMCBhbmQgOTkgYXJlIGludGVycHJldGVkIGFzIDE5WFg7IHJldmVydCB0aGF0XG4gIGlmIChvYmoueWVhciA8IDEwMCAmJiBvYmoueWVhciA+PSAwKSB7XG4gICAgZCA9IG5ldyBEYXRlKGQpO1xuICAgIGQuc2V0VVRDRnVsbFllYXIoZC5nZXRVVENGdWxsWWVhcigpIC0gMTkwMCk7XG4gIH1cbiAgcmV0dXJuICtkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2Vla3NJbldlZWtZZWFyKHdlZWtZZWFyKSB7XG4gIGNvbnN0IHAxID1cbiAgICAgICh3ZWVrWWVhciArXG4gICAgICAgIE1hdGguZmxvb3Iod2Vla1llYXIgLyA0KSAtXG4gICAgICAgIE1hdGguZmxvb3Iod2Vla1llYXIgLyAxMDApICtcbiAgICAgICAgTWF0aC5mbG9vcih3ZWVrWWVhciAvIDQwMCkpICVcbiAgICAgIDcsXG4gICAgbGFzdCA9IHdlZWtZZWFyIC0gMSxcbiAgICBwMiA9IChsYXN0ICsgTWF0aC5mbG9vcihsYXN0IC8gNCkgLSBNYXRoLmZsb29yKGxhc3QgLyAxMDApICsgTWF0aC5mbG9vcihsYXN0IC8gNDAwKSkgJSA3O1xuICByZXR1cm4gcDEgPT09IDQgfHwgcDIgPT09IDMgPyA1MyA6IDUyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW50cnVuY2F0ZVllYXIoeWVhcikge1xuICBpZiAoeWVhciA+IDk5KSB7XG4gICAgcmV0dXJuIHllYXI7XG4gIH0gZWxzZSByZXR1cm4geWVhciA+IDYwID8gMTkwMCArIHllYXIgOiAyMDAwICsgeWVhcjtcbn1cblxuLy8gUEFSU0lOR1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2Vab25lSW5mbyh0cywgb2Zmc2V0Rm9ybWF0LCBsb2NhbGUsIHRpbWVab25lID0gbnVsbCkge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUodHMpLFxuICAgIGludGxPcHRzID0ge1xuICAgICAgaG91ckN5Y2xlOiBcImgyM1wiLFxuICAgICAgeWVhcjogXCJudW1lcmljXCIsXG4gICAgICBtb250aDogXCIyLWRpZ2l0XCIsXG4gICAgICBkYXk6IFwiMi1kaWdpdFwiLFxuICAgICAgaG91cjogXCIyLWRpZ2l0XCIsXG4gICAgICBtaW51dGU6IFwiMi1kaWdpdFwiLFxuICAgIH07XG5cbiAgaWYgKHRpbWVab25lKSB7XG4gICAgaW50bE9wdHMudGltZVpvbmUgPSB0aW1lWm9uZTtcbiAgfVxuXG4gIGNvbnN0IG1vZGlmaWVkID0geyB0aW1lWm9uZU5hbWU6IG9mZnNldEZvcm1hdCwgLi4uaW50bE9wdHMgfTtcblxuICBjb25zdCBwYXJzZWQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIG1vZGlmaWVkKVxuICAgIC5mb3JtYXRUb1BhcnRzKGRhdGUpXG4gICAgLmZpbmQoKG0pID0+IG0udHlwZS50b0xvd2VyQ2FzZSgpID09PSBcInRpbWV6b25lbmFtZVwiKTtcbiAgcmV0dXJuIHBhcnNlZCA/IHBhcnNlZC52YWx1ZSA6IG51bGw7XG59XG5cbi8vIHNpZ25lZE9mZnNldCgnLTUnLCAnMzAnKSAtPiAtMzMwXG5leHBvcnQgZnVuY3Rpb24gc2lnbmVkT2Zmc2V0KG9mZkhvdXJTdHIsIG9mZk1pbnV0ZVN0cikge1xuICBsZXQgb2ZmSG91ciA9IHBhcnNlSW50KG9mZkhvdXJTdHIsIDEwKTtcblxuICAvLyBkb24ndCB8fCB0aGlzIGJlY2F1c2Ugd2Ugd2FudCB0byBwcmVzZXJ2ZSAtMFxuICBpZiAoTnVtYmVyLmlzTmFOKG9mZkhvdXIpKSB7XG4gICAgb2ZmSG91ciA9IDA7XG4gIH1cblxuICBjb25zdCBvZmZNaW4gPSBwYXJzZUludChvZmZNaW51dGVTdHIsIDEwKSB8fCAwLFxuICAgIG9mZk1pblNpZ25lZCA9IG9mZkhvdXIgPCAwIHx8IE9iamVjdC5pcyhvZmZIb3VyLCAtMCkgPyAtb2ZmTWluIDogb2ZmTWluO1xuICByZXR1cm4gb2ZmSG91ciAqIDYwICsgb2ZmTWluU2lnbmVkO1xufVxuXG4vLyBDT0VSQ0lPTlxuXG5leHBvcnQgZnVuY3Rpb24gYXNOdW1iZXIodmFsdWUpIHtcbiAgY29uc3QgbnVtZXJpY1ZhbHVlID0gTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIgfHwgdmFsdWUgPT09IFwiXCIgfHwgTnVtYmVyLmlzTmFOKG51bWVyaWNWYWx1ZSkpXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKGBJbnZhbGlkIHVuaXQgdmFsdWUgJHt2YWx1ZX1gKTtcbiAgcmV0dXJuIG51bWVyaWNWYWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZU9iamVjdChvYmosIG5vcm1hbGl6ZXIpIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHt9O1xuICBmb3IgKGNvbnN0IHUgaW4gb2JqKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5KG9iaiwgdSkpIHtcbiAgICAgIGNvbnN0IHYgPSBvYmpbdV07XG4gICAgICBpZiAodiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgbm9ybWFsaXplZFtub3JtYWxpemVyKHUpXSA9IGFzTnVtYmVyKHYpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE9mZnNldChvZmZzZXQsIGZvcm1hdCkge1xuICBjb25zdCBob3VycyA9IE1hdGgudHJ1bmMoTWF0aC5hYnMob2Zmc2V0IC8gNjApKSxcbiAgICBtaW51dGVzID0gTWF0aC50cnVuYyhNYXRoLmFicyhvZmZzZXQgJSA2MCkpLFxuICAgIHNpZ24gPSBvZmZzZXQgPj0gMCA/IFwiK1wiIDogXCItXCI7XG5cbiAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICBjYXNlIFwic2hvcnRcIjpcbiAgICAgIHJldHVybiBgJHtzaWdufSR7cGFkU3RhcnQoaG91cnMsIDIpfToke3BhZFN0YXJ0KG1pbnV0ZXMsIDIpfWA7XG4gICAgY2FzZSBcIm5hcnJvd1wiOlxuICAgICAgcmV0dXJuIGAke3NpZ259JHtob3Vyc30ke21pbnV0ZXMgPiAwID8gYDoke21pbnV0ZXN9YCA6IFwiXCJ9YDtcbiAgICBjYXNlIFwidGVjaGllXCI6XG4gICAgICByZXR1cm4gYCR7c2lnbn0ke3BhZFN0YXJ0KGhvdXJzLCAyKX0ke3BhZFN0YXJ0KG1pbnV0ZXMsIDIpfWA7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBWYWx1ZSBmb3JtYXQgJHtmb3JtYXR9IGlzIG91dCBvZiByYW5nZSBmb3IgcHJvcGVydHkgZm9ybWF0YCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVPYmplY3Qob2JqKSB7XG4gIHJldHVybiBwaWNrKG9iaiwgW1wiaG91clwiLCBcIm1pbnV0ZVwiLCBcInNlY29uZFwiLCBcIm1pbGxpc2Vjb25kXCJdKTtcbn1cblxuZXhwb3J0IGNvbnN0IGlhbmFSZWdleCA9IC9bQS1aYS16XystXXsxLDI1Nn0oOj9cXC9bQS1aYS16XystXXsxLDI1Nn0oXFwvW0EtWmEtel8rLV17MSwyNTZ9KT8pPy87XG4iLCAiaW1wb3J0ICogYXMgRm9ybWF0cyBmcm9tIFwiLi9mb3JtYXRzLmpzXCI7XG5pbXBvcnQgeyBwaWNrIH0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuXG5mdW5jdGlvbiBzdHJpbmdpZnkob2JqKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIE9iamVjdC5rZXlzKG9iaikuc29ydCgpKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmV4cG9ydCBjb25zdCBtb250aHNMb25nID0gW1xuICBcIkphbnVhcnlcIixcbiAgXCJGZWJydWFyeVwiLFxuICBcIk1hcmNoXCIsXG4gIFwiQXByaWxcIixcbiAgXCJNYXlcIixcbiAgXCJKdW5lXCIsXG4gIFwiSnVseVwiLFxuICBcIkF1Z3VzdFwiLFxuICBcIlNlcHRlbWJlclwiLFxuICBcIk9jdG9iZXJcIixcbiAgXCJOb3ZlbWJlclwiLFxuICBcIkRlY2VtYmVyXCIsXG5dO1xuXG5leHBvcnQgY29uc3QgbW9udGhzU2hvcnQgPSBbXG4gIFwiSmFuXCIsXG4gIFwiRmViXCIsXG4gIFwiTWFyXCIsXG4gIFwiQXByXCIsXG4gIFwiTWF5XCIsXG4gIFwiSnVuXCIsXG4gIFwiSnVsXCIsXG4gIFwiQXVnXCIsXG4gIFwiU2VwXCIsXG4gIFwiT2N0XCIsXG4gIFwiTm92XCIsXG4gIFwiRGVjXCIsXG5dO1xuXG5leHBvcnQgY29uc3QgbW9udGhzTmFycm93ID0gW1wiSlwiLCBcIkZcIiwgXCJNXCIsIFwiQVwiLCBcIk1cIiwgXCJKXCIsIFwiSlwiLCBcIkFcIiwgXCJTXCIsIFwiT1wiLCBcIk5cIiwgXCJEXCJdO1xuXG5leHBvcnQgZnVuY3Rpb24gbW9udGhzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgXCJuYXJyb3dcIjpcbiAgICAgIHJldHVybiBbLi4ubW9udGhzTmFycm93XTtcbiAgICBjYXNlIFwic2hvcnRcIjpcbiAgICAgIHJldHVybiBbLi4ubW9udGhzU2hvcnRdO1xuICAgIGNhc2UgXCJsb25nXCI6XG4gICAgICByZXR1cm4gWy4uLm1vbnRoc0xvbmddO1xuICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICByZXR1cm4gW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiLCBcIjVcIiwgXCI2XCIsIFwiN1wiLCBcIjhcIiwgXCI5XCIsIFwiMTBcIiwgXCIxMVwiLCBcIjEyXCJdO1xuICAgIGNhc2UgXCIyLWRpZ2l0XCI6XG4gICAgICByZXR1cm4gW1wiMDFcIiwgXCIwMlwiLCBcIjAzXCIsIFwiMDRcIiwgXCIwNVwiLCBcIjA2XCIsIFwiMDdcIiwgXCIwOFwiLCBcIjA5XCIsIFwiMTBcIiwgXCIxMVwiLCBcIjEyXCJdO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgd2Vla2RheXNMb25nID0gW1xuICBcIk1vbmRheVwiLFxuICBcIlR1ZXNkYXlcIixcbiAgXCJXZWRuZXNkYXlcIixcbiAgXCJUaHVyc2RheVwiLFxuICBcIkZyaWRheVwiLFxuICBcIlNhdHVyZGF5XCIsXG4gIFwiU3VuZGF5XCIsXG5dO1xuXG5leHBvcnQgY29uc3Qgd2Vla2RheXNTaG9ydCA9IFtcIk1vblwiLCBcIlR1ZVwiLCBcIldlZFwiLCBcIlRodVwiLCBcIkZyaVwiLCBcIlNhdFwiLCBcIlN1blwiXTtcblxuZXhwb3J0IGNvbnN0IHdlZWtkYXlzTmFycm93ID0gW1wiTVwiLCBcIlRcIiwgXCJXXCIsIFwiVFwiLCBcIkZcIiwgXCJTXCIsIFwiU1wiXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHdlZWtkYXlzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgXCJuYXJyb3dcIjpcbiAgICAgIHJldHVybiBbLi4ud2Vla2RheXNOYXJyb3ddO1xuICAgIGNhc2UgXCJzaG9ydFwiOlxuICAgICAgcmV0dXJuIFsuLi53ZWVrZGF5c1Nob3J0XTtcbiAgICBjYXNlIFwibG9uZ1wiOlxuICAgICAgcmV0dXJuIFsuLi53ZWVrZGF5c0xvbmddO1xuICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICByZXR1cm4gW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiLCBcIjVcIiwgXCI2XCIsIFwiN1wiXTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG1lcmlkaWVtcyA9IFtcIkFNXCIsIFwiUE1cIl07XG5cbmV4cG9ydCBjb25zdCBlcmFzTG9uZyA9IFtcIkJlZm9yZSBDaHJpc3RcIiwgXCJBbm5vIERvbWluaVwiXTtcblxuZXhwb3J0IGNvbnN0IGVyYXNTaG9ydCA9IFtcIkJDXCIsIFwiQURcIl07XG5cbmV4cG9ydCBjb25zdCBlcmFzTmFycm93ID0gW1wiQlwiLCBcIkFcIl07XG5cbmV4cG9ydCBmdW5jdGlvbiBlcmFzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgXCJuYXJyb3dcIjpcbiAgICAgIHJldHVybiBbLi4uZXJhc05hcnJvd107XG4gICAgY2FzZSBcInNob3J0XCI6XG4gICAgICByZXR1cm4gWy4uLmVyYXNTaG9ydF07XG4gICAgY2FzZSBcImxvbmdcIjpcbiAgICAgIHJldHVybiBbLi4uZXJhc0xvbmddO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyaWRpZW1Gb3JEYXRlVGltZShkdCkge1xuICByZXR1cm4gbWVyaWRpZW1zW2R0LmhvdXIgPCAxMiA/IDAgOiAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdlZWtkYXlGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSB7XG4gIHJldHVybiB3ZWVrZGF5cyhsZW5ndGgpW2R0LndlZWtkYXkgLSAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1vbnRoRm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkge1xuICByZXR1cm4gbW9udGhzKGxlbmd0aClbZHQubW9udGggLSAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVyYUZvckRhdGVUaW1lKGR0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGVyYXMobGVuZ3RoKVtkdC55ZWFyIDwgMCA/IDAgOiAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJlbGF0aXZlVGltZSh1bml0LCBjb3VudCwgbnVtZXJpYyA9IFwiYWx3YXlzXCIsIG5hcnJvdyA9IGZhbHNlKSB7XG4gIGNvbnN0IHVuaXRzID0ge1xuICAgIHllYXJzOiBbXCJ5ZWFyXCIsIFwieXIuXCJdLFxuICAgIHF1YXJ0ZXJzOiBbXCJxdWFydGVyXCIsIFwicXRyLlwiXSxcbiAgICBtb250aHM6IFtcIm1vbnRoXCIsIFwibW8uXCJdLFxuICAgIHdlZWtzOiBbXCJ3ZWVrXCIsIFwid2suXCJdLFxuICAgIGRheXM6IFtcImRheVwiLCBcImRheVwiLCBcImRheXNcIl0sXG4gICAgaG91cnM6IFtcImhvdXJcIiwgXCJoci5cIl0sXG4gICAgbWludXRlczogW1wibWludXRlXCIsIFwibWluLlwiXSxcbiAgICBzZWNvbmRzOiBbXCJzZWNvbmRcIiwgXCJzZWMuXCJdLFxuICB9O1xuXG4gIGNvbnN0IGxhc3RhYmxlID0gW1wiaG91cnNcIiwgXCJtaW51dGVzXCIsIFwic2Vjb25kc1wiXS5pbmRleE9mKHVuaXQpID09PSAtMTtcblxuICBpZiAobnVtZXJpYyA9PT0gXCJhdXRvXCIgJiYgbGFzdGFibGUpIHtcbiAgICBjb25zdCBpc0RheSA9IHVuaXQgPT09IFwiZGF5c1wiO1xuICAgIHN3aXRjaCAoY291bnQpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIGlzRGF5ID8gXCJ0b21vcnJvd1wiIDogYG5leHQgJHt1bml0c1t1bml0XVswXX1gO1xuICAgICAgY2FzZSAtMTpcbiAgICAgICAgcmV0dXJuIGlzRGF5ID8gXCJ5ZXN0ZXJkYXlcIiA6IGBsYXN0ICR7dW5pdHNbdW5pdF1bMF19YDtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIGlzRGF5ID8gXCJ0b2RheVwiIDogYHRoaXMgJHt1bml0c1t1bml0XVswXX1gO1xuICAgICAgZGVmYXVsdDogLy8gZmFsbCB0aHJvdWdoXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaXNJblBhc3QgPSBPYmplY3QuaXMoY291bnQsIC0wKSB8fCBjb3VudCA8IDAsXG4gICAgZm10VmFsdWUgPSBNYXRoLmFicyhjb3VudCksXG4gICAgc2luZ3VsYXIgPSBmbXRWYWx1ZSA9PT0gMSxcbiAgICBsaWxVbml0cyA9IHVuaXRzW3VuaXRdLFxuICAgIGZtdFVuaXQgPSBuYXJyb3dcbiAgICAgID8gc2luZ3VsYXJcbiAgICAgICAgPyBsaWxVbml0c1sxXVxuICAgICAgICA6IGxpbFVuaXRzWzJdIHx8IGxpbFVuaXRzWzFdXG4gICAgICA6IHNpbmd1bGFyXG4gICAgICA/IHVuaXRzW3VuaXRdWzBdXG4gICAgICA6IHVuaXQ7XG4gIHJldHVybiBpc0luUGFzdCA/IGAke2ZtdFZhbHVlfSAke2ZtdFVuaXR9IGFnb2AgOiBgaW4gJHtmbXRWYWx1ZX0gJHtmbXRVbml0fWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRTdHJpbmcoa25vd25Gb3JtYXQpIHtcbiAgLy8gdGhlc2UgYWxsIGhhdmUgdGhlIG9mZnNldHMgcmVtb3ZlZCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZW1cbiAgLy8gd2l0aG91dCBhbGwgdGhlIGludGwgc3R1ZmYgdGhpcyBpcyBiYWNrZmlsbGluZ1xuICBjb25zdCBmaWx0ZXJlZCA9IHBpY2soa25vd25Gb3JtYXQsIFtcbiAgICAgIFwid2Vla2RheVwiLFxuICAgICAgXCJlcmFcIixcbiAgICAgIFwieWVhclwiLFxuICAgICAgXCJtb250aFwiLFxuICAgICAgXCJkYXlcIixcbiAgICAgIFwiaG91clwiLFxuICAgICAgXCJtaW51dGVcIixcbiAgICAgIFwic2Vjb25kXCIsXG4gICAgICBcInRpbWVab25lTmFtZVwiLFxuICAgICAgXCJob3VyQ3ljbGVcIixcbiAgICBdKSxcbiAgICBrZXkgPSBzdHJpbmdpZnkoZmlsdGVyZWQpLFxuICAgIGRhdGVUaW1lSHVnZSA9IFwiRUVFRSwgTExMTCBkLCB5eXl5LCBoOm1tIGFcIjtcbiAgc3dpdGNoIChrZXkpIHtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVfU0hPUlQpOlxuICAgICAgcmV0dXJuIFwiTS9kL3l5eXlcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVfTUVEKTpcbiAgICAgIHJldHVybiBcIkxMTCBkLCB5eXl5XCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5EQVRFX01FRF9XSVRIX1dFRUtEQVkpOlxuICAgICAgcmV0dXJuIFwiRUVFLCBMTEwgZCwgeXl5eVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuREFURV9GVUxMKTpcbiAgICAgIHJldHVybiBcIkxMTEwgZCwgeXl5eVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuREFURV9IVUdFKTpcbiAgICAgIHJldHVybiBcIkVFRUUsIExMTEwgZCwgeXl5eVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuVElNRV9TSU1QTEUpOlxuICAgICAgcmV0dXJuIFwiaDptbSBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5USU1FX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJoOm1tOnNzIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLlRJTUVfV0lUSF9TSE9SVF9PRkZTRVQpOlxuICAgICAgcmV0dXJuIFwiaDptbSBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5USU1FX1dJVEhfTE9OR19PRkZTRVQpOlxuICAgICAgcmV0dXJuIFwiaDptbSBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5USU1FXzI0X1NJTVBMRSk6XG4gICAgICByZXR1cm4gXCJISDptbVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuVElNRV8yNF9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuIFwiSEg6bW06c3NcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLlRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQpOlxuICAgICAgcmV0dXJuIFwiSEg6bW1cIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLlRJTUVfMjRfV0lUSF9MT05HX09GRlNFVCk6XG4gICAgICByZXR1cm4gXCJISDptbVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuREFURVRJTUVfU0hPUlQpOlxuICAgICAgcmV0dXJuIFwiTS9kL3l5eXksIGg6bW0gYVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuREFURVRJTUVfTUVEKTpcbiAgICAgIHJldHVybiBcIkxMTCBkLCB5eXl5LCBoOm1tIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX0ZVTEwpOlxuICAgICAgcmV0dXJuIFwiTExMTCBkLCB5eXl5LCBoOm1tIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX0hVR0UpOlxuICAgICAgcmV0dXJuIGRhdGVUaW1lSHVnZTtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJNL2QveXl5eSwgaDptbTpzcyBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5EQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiBcIkxMTCBkLCB5eXl5LCBoOm1tOnNzIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX01FRF9XSVRIX1dFRUtEQVkpOlxuICAgICAgcmV0dXJuIFwiRUVFLCBkIExMTCB5eXl5LCBoOm1tIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiBcIkxMTEwgZCwgeXl5eSwgaDptbTpzcyBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5EQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJFRUVFLCBMTExMIGQsIHl5eXksIGg6bW06c3MgYVwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZGF0ZVRpbWVIdWdlO1xuICB9XG59XG4iLCAiaW1wb3J0ICogYXMgRW5nbGlzaCBmcm9tIFwiLi9lbmdsaXNoLmpzXCI7XG5pbXBvcnQgKiBhcyBGb3JtYXRzIGZyb20gXCIuL2Zvcm1hdHMuanNcIjtcbmltcG9ydCB7IHBhZFN0YXJ0IH0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuXG5mdW5jdGlvbiBzdHJpbmdpZnlUb2tlbnMoc3BsaXRzLCB0b2tlblRvU3RyaW5nKSB7XG4gIGxldCBzID0gXCJcIjtcbiAgZm9yIChjb25zdCB0b2tlbiBvZiBzcGxpdHMpIHtcbiAgICBpZiAodG9rZW4ubGl0ZXJhbCkge1xuICAgICAgcyArPSB0b2tlbi52YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMgKz0gdG9rZW5Ub1N0cmluZyh0b2tlbi52YWwpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcztcbn1cblxuY29uc3QgbWFjcm9Ub2tlblRvRm9ybWF0T3B0cyA9IHtcbiAgRDogRm9ybWF0cy5EQVRFX1NIT1JULFxuICBERDogRm9ybWF0cy5EQVRFX01FRCxcbiAgREREOiBGb3JtYXRzLkRBVEVfRlVMTCxcbiAgRERERDogRm9ybWF0cy5EQVRFX0hVR0UsXG4gIHQ6IEZvcm1hdHMuVElNRV9TSU1QTEUsXG4gIHR0OiBGb3JtYXRzLlRJTUVfV0lUSF9TRUNPTkRTLFxuICB0dHQ6IEZvcm1hdHMuVElNRV9XSVRIX1NIT1JUX09GRlNFVCxcbiAgdHR0dDogRm9ybWF0cy5USU1FX1dJVEhfTE9OR19PRkZTRVQsXG4gIFQ6IEZvcm1hdHMuVElNRV8yNF9TSU1QTEUsXG4gIFRUOiBGb3JtYXRzLlRJTUVfMjRfV0lUSF9TRUNPTkRTLFxuICBUVFQ6IEZvcm1hdHMuVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCxcbiAgVFRUVDogRm9ybWF0cy5USU1FXzI0X1dJVEhfTE9OR19PRkZTRVQsXG4gIGY6IEZvcm1hdHMuREFURVRJTUVfU0hPUlQsXG4gIGZmOiBGb3JtYXRzLkRBVEVUSU1FX01FRCxcbiAgZmZmOiBGb3JtYXRzLkRBVEVUSU1FX0ZVTEwsXG4gIGZmZmY6IEZvcm1hdHMuREFURVRJTUVfSFVHRSxcbiAgRjogRm9ybWF0cy5EQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMsXG4gIEZGOiBGb3JtYXRzLkRBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFMsXG4gIEZGRjogRm9ybWF0cy5EQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUyxcbiAgRkZGRjogRm9ybWF0cy5EQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EUyxcbn07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGb3JtYXR0ZXIge1xuICBzdGF0aWMgY3JlYXRlKGxvY2FsZSwgb3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBGb3JtYXR0ZXIobG9jYWxlLCBvcHRzKTtcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZUZvcm1hdChmbXQpIHtcbiAgICBsZXQgY3VycmVudCA9IG51bGwsXG4gICAgICBjdXJyZW50RnVsbCA9IFwiXCIsXG4gICAgICBicmFja2V0ZWQgPSBmYWxzZTtcbiAgICBjb25zdCBzcGxpdHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZtdC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYyA9IGZtdC5jaGFyQXQoaSk7XG4gICAgICBpZiAoYyA9PT0gXCInXCIpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzcGxpdHMucHVzaCh7IGxpdGVyYWw6IGJyYWNrZXRlZCwgdmFsOiBjdXJyZW50RnVsbCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gbnVsbDtcbiAgICAgICAgY3VycmVudEZ1bGwgPSBcIlwiO1xuICAgICAgICBicmFja2V0ZWQgPSAhYnJhY2tldGVkO1xuICAgICAgfSBlbHNlIGlmIChicmFja2V0ZWQpIHtcbiAgICAgICAgY3VycmVudEZ1bGwgKz0gYztcbiAgICAgIH0gZWxzZSBpZiAoYyA9PT0gY3VycmVudCkge1xuICAgICAgICBjdXJyZW50RnVsbCArPSBjO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzcGxpdHMucHVzaCh7IGxpdGVyYWw6IGZhbHNlLCB2YWw6IGN1cnJlbnRGdWxsIH0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRGdWxsID0gYztcbiAgICAgICAgY3VycmVudCA9IGM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwbGl0cy5wdXNoKHsgbGl0ZXJhbDogYnJhY2tldGVkLCB2YWw6IGN1cnJlbnRGdWxsIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBzcGxpdHM7XG4gIH1cblxuICBzdGF0aWMgbWFjcm9Ub2tlblRvRm9ybWF0T3B0cyh0b2tlbikge1xuICAgIHJldHVybiBtYWNyb1Rva2VuVG9Gb3JtYXRPcHRzW3Rva2VuXTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGxvY2FsZSwgZm9ybWF0T3B0cykge1xuICAgIHRoaXMub3B0cyA9IGZvcm1hdE9wdHM7XG4gICAgdGhpcy5sb2MgPSBsb2NhbGU7XG4gICAgdGhpcy5zeXN0ZW1Mb2MgPSBudWxsO1xuICB9XG5cbiAgZm9ybWF0V2l0aFN5c3RlbURlZmF1bHQoZHQsIG9wdHMpIHtcbiAgICBpZiAodGhpcy5zeXN0ZW1Mb2MgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuc3lzdGVtTG9jID0gdGhpcy5sb2MucmVkZWZhdWx0VG9TeXN0ZW0oKTtcbiAgICB9XG4gICAgY29uc3QgZGYgPSB0aGlzLnN5c3RlbUxvYy5kdEZvcm1hdHRlcihkdCwgeyAuLi50aGlzLm9wdHMsIC4uLm9wdHMgfSk7XG4gICAgcmV0dXJuIGRmLmZvcm1hdCgpO1xuICB9XG5cbiAgZm9ybWF0RGF0ZVRpbWUoZHQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIHsgLi4udGhpcy5vcHRzLCAuLi5vcHRzIH0pO1xuICAgIHJldHVybiBkZi5mb3JtYXQoKTtcbiAgfVxuXG4gIGZvcm1hdERhdGVUaW1lUGFydHMoZHQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIHsgLi4udGhpcy5vcHRzLCAuLi5vcHRzIH0pO1xuICAgIHJldHVybiBkZi5mb3JtYXRUb1BhcnRzKCk7XG4gIH1cblxuICByZXNvbHZlZE9wdGlvbnMoZHQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIHsgLi4udGhpcy5vcHRzLCAuLi5vcHRzIH0pO1xuICAgIHJldHVybiBkZi5yZXNvbHZlZE9wdGlvbnMoKTtcbiAgfVxuXG4gIG51bShuLCBwID0gMCkge1xuICAgIC8vIHdlIGdldCBzb21lIHBlcmYgb3V0IG9mIGRvaW5nIHRoaXMgaGVyZSwgYW5ub3lpbmdseVxuICAgIGlmICh0aGlzLm9wdHMuZm9yY2VTaW1wbGUpIHtcbiAgICAgIHJldHVybiBwYWRTdGFydChuLCBwKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRzID0geyAuLi50aGlzLm9wdHMgfTtcblxuICAgIGlmIChwID4gMCkge1xuICAgICAgb3B0cy5wYWRUbyA9IHA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubG9jLm51bWJlckZvcm1hdHRlcihvcHRzKS5mb3JtYXQobik7XG4gIH1cblxuICBmb3JtYXREYXRlVGltZUZyb21TdHJpbmcoZHQsIGZtdCkge1xuICAgIGNvbnN0IGtub3duRW5nbGlzaCA9IHRoaXMubG9jLmxpc3RpbmdNb2RlKCkgPT09IFwiZW5cIixcbiAgICAgIHVzZURhdGVUaW1lRm9ybWF0dGVyID0gdGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXIgJiYgdGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXIgIT09IFwiZ3JlZ29yeVwiLFxuICAgICAgc3RyaW5nID0gKG9wdHMsIGV4dHJhY3QpID0+IHRoaXMubG9jLmV4dHJhY3QoZHQsIG9wdHMsIGV4dHJhY3QpLFxuICAgICAgZm9ybWF0T2Zmc2V0ID0gKG9wdHMpID0+IHtcbiAgICAgICAgaWYgKGR0LmlzT2Zmc2V0Rml4ZWQgJiYgZHQub2Zmc2V0ID09PSAwICYmIG9wdHMuYWxsb3daKSB7XG4gICAgICAgICAgcmV0dXJuIFwiWlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGR0LmlzVmFsaWQgPyBkdC56b25lLmZvcm1hdE9mZnNldChkdC50cywgb3B0cy5mb3JtYXQpIDogXCJcIjtcbiAgICAgIH0sXG4gICAgICBtZXJpZGllbSA9ICgpID0+XG4gICAgICAgIGtub3duRW5nbGlzaFxuICAgICAgICAgID8gRW5nbGlzaC5tZXJpZGllbUZvckRhdGVUaW1lKGR0KVxuICAgICAgICAgIDogc3RyaW5nKHsgaG91cjogXCJudW1lcmljXCIsIGhvdXJDeWNsZTogXCJoMTJcIiB9LCBcImRheXBlcmlvZFwiKSxcbiAgICAgIG1vbnRoID0gKGxlbmd0aCwgc3RhbmRhbG9uZSkgPT5cbiAgICAgICAga25vd25FbmdsaXNoXG4gICAgICAgICAgPyBFbmdsaXNoLm1vbnRoRm9yRGF0ZVRpbWUoZHQsIGxlbmd0aClcbiAgICAgICAgICA6IHN0cmluZyhzdGFuZGFsb25lID8geyBtb250aDogbGVuZ3RoIH0gOiB7IG1vbnRoOiBsZW5ndGgsIGRheTogXCJudW1lcmljXCIgfSwgXCJtb250aFwiKSxcbiAgICAgIHdlZWtkYXkgPSAobGVuZ3RoLCBzdGFuZGFsb25lKSA9PlxuICAgICAgICBrbm93bkVuZ2xpc2hcbiAgICAgICAgICA/IEVuZ2xpc2gud2Vla2RheUZvckRhdGVUaW1lKGR0LCBsZW5ndGgpXG4gICAgICAgICAgOiBzdHJpbmcoXG4gICAgICAgICAgICAgIHN0YW5kYWxvbmUgPyB7IHdlZWtkYXk6IGxlbmd0aCB9IDogeyB3ZWVrZGF5OiBsZW5ndGgsIG1vbnRoOiBcImxvbmdcIiwgZGF5OiBcIm51bWVyaWNcIiB9LFxuICAgICAgICAgICAgICBcIndlZWtkYXlcIlxuICAgICAgICAgICAgKSxcbiAgICAgIG1heWJlTWFjcm8gPSAodG9rZW4pID0+IHtcbiAgICAgICAgY29uc3QgZm9ybWF0T3B0cyA9IEZvcm1hdHRlci5tYWNyb1Rva2VuVG9Gb3JtYXRPcHRzKHRva2VuKTtcbiAgICAgICAgaWYgKGZvcm1hdE9wdHMpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRXaXRoU3lzdGVtRGVmYXVsdChkdCwgZm9ybWF0T3B0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJhID0gKGxlbmd0aCkgPT5cbiAgICAgICAga25vd25FbmdsaXNoID8gRW5nbGlzaC5lcmFGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSA6IHN0cmluZyh7IGVyYTogbGVuZ3RoIH0sIFwiZXJhXCIpLFxuICAgICAgdG9rZW5Ub1N0cmluZyA9ICh0b2tlbikgPT4ge1xuICAgICAgICAvLyBXaGVyZSBwb3NzaWJsZTogaHR0cDovL2NsZHIudW5pY29kZS5vcmcvdHJhbnNsYXRpb24vZGF0ZS10aW1lLTEvZGF0ZS10aW1lI1RPQy1TdGFuZGFsb25lLXZzLi1Gb3JtYXQtU3R5bGVzXG4gICAgICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgICAgICAvLyBtc1xuICAgICAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQubWlsbGlzZWNvbmQpO1xuICAgICAgICAgIGNhc2UgXCJ1XCI6XG4gICAgICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgICAgIGNhc2UgXCJTU1NcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5taWxsaXNlY29uZCwgMyk7XG4gICAgICAgICAgLy8gc2Vjb25kc1xuICAgICAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQuc2Vjb25kKTtcbiAgICAgICAgICBjYXNlIFwic3NcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5zZWNvbmQsIDIpO1xuICAgICAgICAgIC8vIG1pbnV0ZXNcbiAgICAgICAgICBjYXNlIFwibVwiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0Lm1pbnV0ZSk7XG4gICAgICAgICAgY2FzZSBcIm1tXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQubWludXRlLCAyKTtcbiAgICAgICAgICAvLyBob3Vyc1xuICAgICAgICAgIGNhc2UgXCJoXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQuaG91ciAlIDEyID09PSAwID8gMTIgOiBkdC5ob3VyICUgMTIpO1xuICAgICAgICAgIGNhc2UgXCJoaFwiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LmhvdXIgJSAxMiA9PT0gMCA/IDEyIDogZHQuaG91ciAlIDEyLCAyKTtcbiAgICAgICAgICBjYXNlIFwiSFwiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LmhvdXIpO1xuICAgICAgICAgIGNhc2UgXCJISFwiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LmhvdXIsIDIpO1xuICAgICAgICAgIC8vIG9mZnNldFxuICAgICAgICAgIGNhc2UgXCJaXCI6XG4gICAgICAgICAgICAvLyBsaWtlICs2XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHsgZm9ybWF0OiBcIm5hcnJvd1wiLCBhbGxvd1o6IHRoaXMub3B0cy5hbGxvd1ogfSk7XG4gICAgICAgICAgY2FzZSBcIlpaXCI6XG4gICAgICAgICAgICAvLyBsaWtlICswNjowMFxuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdE9mZnNldCh7IGZvcm1hdDogXCJzaG9ydFwiLCBhbGxvd1o6IHRoaXMub3B0cy5hbGxvd1ogfSk7XG4gICAgICAgICAgY2FzZSBcIlpaWlwiOlxuICAgICAgICAgICAgLy8gbGlrZSArMDYwMFxuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdE9mZnNldCh7IGZvcm1hdDogXCJ0ZWNoaWVcIiwgYWxsb3daOiB0aGlzLm9wdHMuYWxsb3daIH0pO1xuICAgICAgICAgIGNhc2UgXCJaWlpaXCI6XG4gICAgICAgICAgICAvLyBsaWtlIEVTVFxuICAgICAgICAgICAgcmV0dXJuIGR0LnpvbmUub2Zmc2V0TmFtZShkdC50cywgeyBmb3JtYXQ6IFwic2hvcnRcIiwgbG9jYWxlOiB0aGlzLmxvYy5sb2NhbGUgfSk7XG4gICAgICAgICAgY2FzZSBcIlpaWlpaXCI6XG4gICAgICAgICAgICAvLyBsaWtlIEVhc3Rlcm4gU3RhbmRhcmQgVGltZVxuICAgICAgICAgICAgcmV0dXJuIGR0LnpvbmUub2Zmc2V0TmFtZShkdC50cywgeyBmb3JtYXQ6IFwibG9uZ1wiLCBsb2NhbGU6IHRoaXMubG9jLmxvY2FsZSB9KTtcbiAgICAgICAgICAvLyB6b25lXG4gICAgICAgICAgY2FzZSBcInpcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgQW1lcmljYS9OZXdfWW9ya1xuICAgICAgICAgICAgcmV0dXJuIGR0LnpvbmVOYW1lO1xuICAgICAgICAgIC8vIG1lcmlkaWVtc1xuICAgICAgICAgIGNhc2UgXCJhXCI6XG4gICAgICAgICAgICByZXR1cm4gbWVyaWRpZW0oKTtcbiAgICAgICAgICAvLyBkYXRlc1xuICAgICAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgICAgICByZXR1cm4gdXNlRGF0ZVRpbWVGb3JtYXR0ZXIgPyBzdHJpbmcoeyBkYXk6IFwibnVtZXJpY1wiIH0sIFwiZGF5XCIpIDogdGhpcy5udW0oZHQuZGF5KTtcbiAgICAgICAgICBjYXNlIFwiZGRcIjpcbiAgICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlciA/IHN0cmluZyh7IGRheTogXCIyLWRpZ2l0XCIgfSwgXCJkYXlcIikgOiB0aGlzLm51bShkdC5kYXksIDIpO1xuICAgICAgICAgIC8vIHdlZWtkYXlzIC0gc3RhbmRhbG9uZVxuICAgICAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC53ZWVrZGF5KTtcbiAgICAgICAgICBjYXNlIFwiY2NjXCI6XG4gICAgICAgICAgICAvLyBsaWtlICdUdWVzJ1xuICAgICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJzaG9ydFwiLCB0cnVlKTtcbiAgICAgICAgICBjYXNlIFwiY2NjY1wiOlxuICAgICAgICAgICAgLy8gbGlrZSAnVHVlc2RheSdcbiAgICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwibG9uZ1wiLCB0cnVlKTtcbiAgICAgICAgICBjYXNlIFwiY2NjY2NcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgJ1QnXG4gICAgICAgICAgICByZXR1cm4gd2Vla2RheShcIm5hcnJvd1wiLCB0cnVlKTtcbiAgICAgICAgICAvLyB3ZWVrZGF5cyAtIGZvcm1hdFxuICAgICAgICAgIGNhc2UgXCJFXCI6XG4gICAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC53ZWVrZGF5KTtcbiAgICAgICAgICBjYXNlIFwiRUVFXCI6XG4gICAgICAgICAgICAvLyBsaWtlICdUdWVzJ1xuICAgICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJzaG9ydFwiLCBmYWxzZSk7XG4gICAgICAgICAgY2FzZSBcIkVFRUVcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgJ1R1ZXNkYXknXG4gICAgICAgICAgICByZXR1cm4gd2Vla2RheShcImxvbmdcIiwgZmFsc2UpO1xuICAgICAgICAgIGNhc2UgXCJFRUVFRVwiOlxuICAgICAgICAgICAgLy8gbGlrZSAnVCdcbiAgICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwibmFycm93XCIsIGZhbHNlKTtcbiAgICAgICAgICAvLyBtb250aHMgLSBzdGFuZGFsb25lXG4gICAgICAgICAgY2FzZSBcIkxcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyXG4gICAgICAgICAgICAgID8gc3RyaW5nKHsgbW9udGg6IFwibnVtZXJpY1wiLCBkYXk6IFwibnVtZXJpY1wiIH0sIFwibW9udGhcIilcbiAgICAgICAgICAgICAgOiB0aGlzLm51bShkdC5tb250aCk7XG4gICAgICAgICAgY2FzZSBcIkxMXCI6XG4gICAgICAgICAgICAvLyBsaWtlIDAxLCBkb2Vzbid0IHNlZW0gdG8gd29ya1xuICAgICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyXG4gICAgICAgICAgICAgID8gc3RyaW5nKHsgbW9udGg6IFwiMi1kaWdpdFwiLCBkYXk6IFwibnVtZXJpY1wiIH0sIFwibW9udGhcIilcbiAgICAgICAgICAgICAgOiB0aGlzLm51bShkdC5tb250aCwgMik7XG4gICAgICAgICAgY2FzZSBcIkxMTFwiOlxuICAgICAgICAgICAgLy8gbGlrZSBKYW5cbiAgICAgICAgICAgIHJldHVybiBtb250aChcInNob3J0XCIsIHRydWUpO1xuICAgICAgICAgIGNhc2UgXCJMTExMXCI6XG4gICAgICAgICAgICAvLyBsaWtlIEphbnVhcnlcbiAgICAgICAgICAgIHJldHVybiBtb250aChcImxvbmdcIiwgdHJ1ZSk7XG4gICAgICAgICAgY2FzZSBcIkxMTExMXCI6XG4gICAgICAgICAgICAvLyBsaWtlIEpcbiAgICAgICAgICAgIHJldHVybiBtb250aChcIm5hcnJvd1wiLCB0cnVlKTtcbiAgICAgICAgICAvLyBtb250aHMgLSBmb3JtYXRcbiAgICAgICAgICBjYXNlIFwiTVwiOlxuICAgICAgICAgICAgLy8gbGlrZSAxXG4gICAgICAgICAgICByZXR1cm4gdXNlRGF0ZVRpbWVGb3JtYXR0ZXJcbiAgICAgICAgICAgICAgPyBzdHJpbmcoeyBtb250aDogXCJudW1lcmljXCIgfSwgXCJtb250aFwiKVxuICAgICAgICAgICAgICA6IHRoaXMubnVtKGR0Lm1vbnRoKTtcbiAgICAgICAgICBjYXNlIFwiTU1cIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMDFcbiAgICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlclxuICAgICAgICAgICAgICA/IHN0cmluZyh7IG1vbnRoOiBcIjItZGlnaXRcIiB9LCBcIm1vbnRoXCIpXG4gICAgICAgICAgICAgIDogdGhpcy5udW0oZHQubW9udGgsIDIpO1xuICAgICAgICAgIGNhc2UgXCJNTU1cIjpcbiAgICAgICAgICAgIC8vIGxpa2UgSmFuXG4gICAgICAgICAgICByZXR1cm4gbW9udGgoXCJzaG9ydFwiLCBmYWxzZSk7XG4gICAgICAgICAgY2FzZSBcIk1NTU1cIjpcbiAgICAgICAgICAgIC8vIGxpa2UgSmFudWFyeVxuICAgICAgICAgICAgcmV0dXJuIG1vbnRoKFwibG9uZ1wiLCBmYWxzZSk7XG4gICAgICAgICAgY2FzZSBcIk1NTU1NXCI6XG4gICAgICAgICAgICAvLyBsaWtlIEpcbiAgICAgICAgICAgIHJldHVybiBtb250aChcIm5hcnJvd1wiLCBmYWxzZSk7XG4gICAgICAgICAgLy8geWVhcnNcbiAgICAgICAgICBjYXNlIFwieVwiOlxuICAgICAgICAgICAgLy8gbGlrZSAyMDE0XG4gICAgICAgICAgICByZXR1cm4gdXNlRGF0ZVRpbWVGb3JtYXR0ZXIgPyBzdHJpbmcoeyB5ZWFyOiBcIm51bWVyaWNcIiB9LCBcInllYXJcIikgOiB0aGlzLm51bShkdC55ZWFyKTtcbiAgICAgICAgICBjYXNlIFwieXlcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMTRcbiAgICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlclxuICAgICAgICAgICAgICA/IHN0cmluZyh7IHllYXI6IFwiMi1kaWdpdFwiIH0sIFwieWVhclwiKVxuICAgICAgICAgICAgICA6IHRoaXMubnVtKGR0LnllYXIudG9TdHJpbmcoKS5zbGljZSgtMiksIDIpO1xuICAgICAgICAgIGNhc2UgXCJ5eXl5XCI6XG4gICAgICAgICAgICAvLyBsaWtlIDAwMTJcbiAgICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlclxuICAgICAgICAgICAgICA/IHN0cmluZyh7IHllYXI6IFwibnVtZXJpY1wiIH0sIFwieWVhclwiKVxuICAgICAgICAgICAgICA6IHRoaXMubnVtKGR0LnllYXIsIDQpO1xuICAgICAgICAgIGNhc2UgXCJ5eXl5eXlcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMDAwMDEyXG4gICAgICAgICAgICByZXR1cm4gdXNlRGF0ZVRpbWVGb3JtYXR0ZXJcbiAgICAgICAgICAgICAgPyBzdHJpbmcoeyB5ZWFyOiBcIm51bWVyaWNcIiB9LCBcInllYXJcIilcbiAgICAgICAgICAgICAgOiB0aGlzLm51bShkdC55ZWFyLCA2KTtcbiAgICAgICAgICAvLyBlcmFzXG4gICAgICAgICAgY2FzZSBcIkdcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgQURcbiAgICAgICAgICAgIHJldHVybiBlcmEoXCJzaG9ydFwiKTtcbiAgICAgICAgICBjYXNlIFwiR0dcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgQW5ubyBEb21pbmlcbiAgICAgICAgICAgIHJldHVybiBlcmEoXCJsb25nXCIpO1xuICAgICAgICAgIGNhc2UgXCJHR0dHR1wiOlxuICAgICAgICAgICAgcmV0dXJuIGVyYShcIm5hcnJvd1wiKTtcbiAgICAgICAgICBjYXNlIFwia2tcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC53ZWVrWWVhci50b1N0cmluZygpLnNsaWNlKC0yKSwgMik7XG4gICAgICAgICAgY2FzZSBcImtra2tcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC53ZWVrWWVhciwgNCk7XG4gICAgICAgICAgY2FzZSBcIldcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC53ZWVrTnVtYmVyKTtcbiAgICAgICAgICBjYXNlIFwiV1dcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC53ZWVrTnVtYmVyLCAyKTtcbiAgICAgICAgICBjYXNlIFwib1wiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0Lm9yZGluYWwpO1xuICAgICAgICAgIGNhc2UgXCJvb29cIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5vcmRpbmFsLCAzKTtcbiAgICAgICAgICBjYXNlIFwicVwiOlxuICAgICAgICAgICAgLy8gbGlrZSAxXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQucXVhcnRlcik7XG4gICAgICAgICAgY2FzZSBcInFxXCI6XG4gICAgICAgICAgICAvLyBsaWtlIDAxXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQucXVhcnRlciwgMik7XG4gICAgICAgICAgY2FzZSBcIlhcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShNYXRoLmZsb29yKGR0LnRzIC8gMTAwMCkpO1xuICAgICAgICAgIGNhc2UgXCJ4XCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQudHMpO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbWF5YmVNYWNybyh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICByZXR1cm4gc3RyaW5naWZ5VG9rZW5zKEZvcm1hdHRlci5wYXJzZUZvcm1hdChmbXQpLCB0b2tlblRvU3RyaW5nKTtcbiAgfVxuXG4gIGZvcm1hdER1cmF0aW9uRnJvbVN0cmluZyhkdXIsIGZtdCkge1xuICAgIGNvbnN0IHRva2VuVG9GaWVsZCA9ICh0b2tlbikgPT4ge1xuICAgICAgICBzd2l0Y2ggKHRva2VuWzBdKSB7XG4gICAgICAgICAgY2FzZSBcIlNcIjpcbiAgICAgICAgICAgIHJldHVybiBcIm1pbGxpc2Vjb25kXCI7XG4gICAgICAgICAgY2FzZSBcInNcIjpcbiAgICAgICAgICAgIHJldHVybiBcInNlY29uZFwiO1xuICAgICAgICAgIGNhc2UgXCJtXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJtaW51dGVcIjtcbiAgICAgICAgICBjYXNlIFwiaFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiaG91clwiO1xuICAgICAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJkYXlcIjtcbiAgICAgICAgICBjYXNlIFwiTVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwibW9udGhcIjtcbiAgICAgICAgICBjYXNlIFwieVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwieWVhclwiO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHRva2VuVG9TdHJpbmcgPSAobGlsZHVyKSA9PiAodG9rZW4pID0+IHtcbiAgICAgICAgY29uc3QgbWFwcGVkID0gdG9rZW5Ub0ZpZWxkKHRva2VuKTtcbiAgICAgICAgaWYgKG1hcHBlZCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLm51bShsaWxkdXIuZ2V0KG1hcHBlZCksIHRva2VuLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdG9rZW5zID0gRm9ybWF0dGVyLnBhcnNlRm9ybWF0KGZtdCksXG4gICAgICByZWFsVG9rZW5zID0gdG9rZW5zLnJlZHVjZShcbiAgICAgICAgKGZvdW5kLCB7IGxpdGVyYWwsIHZhbCB9KSA9PiAobGl0ZXJhbCA/IGZvdW5kIDogZm91bmQuY29uY2F0KHZhbCkpLFxuICAgICAgICBbXVxuICAgICAgKSxcbiAgICAgIGNvbGxhcHNlZCA9IGR1ci5zaGlmdFRvKC4uLnJlYWxUb2tlbnMubWFwKHRva2VuVG9GaWVsZCkuZmlsdGVyKCh0KSA9PiB0KSk7XG4gICAgcmV0dXJuIHN0cmluZ2lmeVRva2Vucyh0b2tlbnMsIHRva2VuVG9TdHJpbmcoY29sbGFwc2VkKSk7XG4gIH1cbn1cbiIsICJleHBvcnQgZGVmYXVsdCBjbGFzcyBJbnZhbGlkIHtcbiAgY29uc3RydWN0b3IocmVhc29uLCBleHBsYW5hdGlvbikge1xuICAgIHRoaXMucmVhc29uID0gcmVhc29uO1xuICAgIHRoaXMuZXhwbGFuYXRpb24gPSBleHBsYW5hdGlvbjtcbiAgfVxuXG4gIHRvTWVzc2FnZSgpIHtcbiAgICBpZiAodGhpcy5leHBsYW5hdGlvbikge1xuICAgICAgcmV0dXJuIGAke3RoaXMucmVhc29ufTogJHt0aGlzLmV4cGxhbmF0aW9ufWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYXNvbjtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBab25lSXNBYnN0cmFjdEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzLmpzXCI7XG5cbi8qKlxuICogQGludGVyZmFjZVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBab25lIHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHpvbmVcbiAgICogQGFic3RyYWN0XG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgdHlwZSgpIHtcbiAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoaXMgem9uZS5cbiAgICogQGFic3RyYWN0XG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbmFtZSgpIHtcbiAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgb2Zmc2V0IGlzIGtub3duIHRvIGJlIGZpeGVkIGZvciB0aGUgd2hvbGUgeWVhci5cbiAgICogQGFic3RyYWN0XG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKi9cbiAgZ2V0IGlzVW5pdmVyc2FsKCkge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb2Zmc2V0J3MgY29tbW9uIG5hbWUgKHN1Y2ggYXMgRVNUKSBhdCB0aGUgc3BlY2lmaWVkIHRpbWVzdGFtcFxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRzIC0gRXBvY2ggbWlsbGlzZWNvbmRzIGZvciB3aGljaCB0byBnZXQgdGhlIG5hbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBPcHRpb25zIHRvIGFmZmVjdCB0aGUgZm9ybWF0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLmZvcm1hdCAtIFdoYXQgc3R5bGUgb2Ygb2Zmc2V0IHRvIHJldHVybi4gQWNjZXB0cyAnbG9uZycgb3IgJ3Nob3J0Jy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubG9jYWxlIC0gV2hhdCBsb2NhbGUgdG8gcmV0dXJuIHRoZSBvZmZzZXQgbmFtZSBpbi5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgb2Zmc2V0TmFtZSh0cywgb3B0cykge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb2Zmc2V0J3MgdmFsdWUgYXMgYSBzdHJpbmdcbiAgICogQGFic3RyYWN0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0cyAtIEVwb2NoIG1pbGxpc2Vjb25kcyBmb3Igd2hpY2ggdG8gZ2V0IHRoZSBvZmZzZXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdCAtIFdoYXQgc3R5bGUgb2Ygb2Zmc2V0IHRvIHJldHVybi5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2VwdHMgJ25hcnJvdycsICdzaG9ydCcsIG9yICd0ZWNoaWUnLiBSZXR1cm5pbmcgJys2JywgJyswNjowMCcsIG9yICcrMDYwMCcgcmVzcGVjdGl2ZWx5XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGZvcm1hdE9mZnNldCh0cywgZm9ybWF0KSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG9mZnNldCBpbiBtaW51dGVzIGZvciB0aGlzIHpvbmUgYXQgdGhlIHNwZWNpZmllZCB0aW1lc3RhbXAuXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAcGFyYW0ge251bWJlcn0gdHMgLSBFcG9jaCBtaWxsaXNlY29uZHMgZm9yIHdoaWNoIHRvIGNvbXB1dGUgdGhlIG9mZnNldFxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBvZmZzZXQodHMpIHtcbiAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgWm9uZSBpcyBlcXVhbCB0byBhbm90aGVyIHpvbmVcbiAgICogQGFic3RyYWN0XG4gICAqIEBwYXJhbSB7Wm9uZX0gb3RoZXJab25lIC0gdGhlIHpvbmUgdG8gY29tcGFyZVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZXF1YWxzKG90aGVyWm9uZSkge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBab25lIGlzIHZhbGlkLlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgZm9ybWF0T2Zmc2V0LCBwYXJzZVpvbmVJbmZvIH0gZnJvbSBcIi4uL2ltcGwvdXRpbC5qc1wiO1xuaW1wb3J0IFpvbmUgZnJvbSBcIi4uL3pvbmUuanNcIjtcblxubGV0IHNpbmdsZXRvbiA9IG51bGw7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgbG9jYWwgem9uZSBmb3IgdGhpcyBKYXZhU2NyaXB0IGVudmlyb25tZW50LlxuICogQGltcGxlbWVudHMge1pvbmV9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5c3RlbVpvbmUgZXh0ZW5kcyBab25lIHtcbiAgLyoqXG4gICAqIEdldCBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgbG9jYWwgem9uZVxuICAgKiBAcmV0dXJuIHtTeXN0ZW1ab25lfVxuICAgKi9cbiAgc3RhdGljIGdldCBpbnN0YW5jZSgpIHtcbiAgICBpZiAoc2luZ2xldG9uID09PSBudWxsKSB7XG4gICAgICBzaW5nbGV0b24gPSBuZXcgU3lzdGVtWm9uZSgpO1xuICAgIH1cbiAgICByZXR1cm4gc2luZ2xldG9uO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIFwic3lzdGVtXCI7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCBpc1VuaXZlcnNhbCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBvZmZzZXROYW1lKHRzLCB7IGZvcm1hdCwgbG9jYWxlIH0pIHtcbiAgICByZXR1cm4gcGFyc2Vab25lSW5mbyh0cywgZm9ybWF0LCBsb2NhbGUpO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZm9ybWF0T2Zmc2V0KHRzLCBmb3JtYXQpIHtcbiAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHRoaXMub2Zmc2V0KHRzKSwgZm9ybWF0KTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIG9mZnNldCh0cykge1xuICAgIHJldHVybiAtbmV3IERhdGUodHMpLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBlcXVhbHMob3RoZXJab25lKSB7XG4gICAgcmV0dXJuIG90aGVyWm9uZS50eXBlID09PSBcInN5c3RlbVwiO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IGlzVmFsaWQoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBmb3JtYXRPZmZzZXQsIHBhcnNlWm9uZUluZm8sIGlzVW5kZWZpbmVkLCBpYW5hUmVnZXgsIG9ialRvTG9jYWxUUyB9IGZyb20gXCIuLi9pbXBsL3V0aWwuanNcIjtcbmltcG9ydCBab25lIGZyb20gXCIuLi96b25lLmpzXCI7XG5cbmNvbnN0IG1hdGNoaW5nUmVnZXggPSBSZWdFeHAoYF4ke2lhbmFSZWdleC5zb3VyY2V9JGApO1xuXG5sZXQgZHRmQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIG1ha2VEVEYoem9uZSkge1xuICBpZiAoIWR0ZkNhY2hlW3pvbmVdKSB7XG4gICAgZHRmQ2FjaGVbem9uZV0gPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChcImVuLVVTXCIsIHtcbiAgICAgIGhvdXJDeWNsZTogXCJoMjNcIixcbiAgICAgIHRpbWVab25lOiB6b25lLFxuICAgICAgeWVhcjogXCJudW1lcmljXCIsXG4gICAgICBtb250aDogXCIyLWRpZ2l0XCIsXG4gICAgICBkYXk6IFwiMi1kaWdpdFwiLFxuICAgICAgaG91cjogXCIyLWRpZ2l0XCIsXG4gICAgICBtaW51dGU6IFwiMi1kaWdpdFwiLFxuICAgICAgc2Vjb25kOiBcIjItZGlnaXRcIixcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZHRmQ2FjaGVbem9uZV07XG59XG5cbmNvbnN0IHR5cGVUb1BvcyA9IHtcbiAgeWVhcjogMCxcbiAgbW9udGg6IDEsXG4gIGRheTogMixcbiAgaG91cjogMyxcbiAgbWludXRlOiA0LFxuICBzZWNvbmQ6IDUsXG59O1xuXG5mdW5jdGlvbiBoYWNreU9mZnNldChkdGYsIGRhdGUpIHtcbiAgY29uc3QgZm9ybWF0dGVkID0gZHRmLmZvcm1hdChkYXRlKS5yZXBsYWNlKC9cXHUyMDBFL2csIFwiXCIpLFxuICAgIHBhcnNlZCA9IC8oXFxkKylcXC8oXFxkKylcXC8oXFxkKyksPyAoXFxkKyk6KFxcZCspOihcXGQrKS8uZXhlYyhmb3JtYXR0ZWQpLFxuICAgIFssIGZNb250aCwgZkRheSwgZlllYXIsIGZIb3VyLCBmTWludXRlLCBmU2Vjb25kXSA9IHBhcnNlZDtcbiAgcmV0dXJuIFtmWWVhciwgZk1vbnRoLCBmRGF5LCBmSG91ciwgZk1pbnV0ZSwgZlNlY29uZF07XG59XG5cbmZ1bmN0aW9uIHBhcnRzT2Zmc2V0KGR0ZiwgZGF0ZSkge1xuICBjb25zdCBmb3JtYXR0ZWQgPSBkdGYuZm9ybWF0VG9QYXJ0cyhkYXRlKSxcbiAgICBmaWxsZWQgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtYXR0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB7IHR5cGUsIHZhbHVlIH0gPSBmb3JtYXR0ZWRbaV0sXG4gICAgICBwb3MgPSB0eXBlVG9Qb3NbdHlwZV07XG5cbiAgICBpZiAoIWlzVW5kZWZpbmVkKHBvcykpIHtcbiAgICAgIGZpbGxlZFtwb3NdID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZpbGxlZDtcbn1cblxubGV0IGlhbmFab25lQ2FjaGUgPSB7fTtcbi8qKlxuICogQSB6b25lIGlkZW50aWZpZWQgYnkgYW4gSUFOQSBpZGVudGlmaWVyLCBsaWtlIEFtZXJpY2EvTmV3X1lvcmtcbiAqIEBpbXBsZW1lbnRzIHtab25lfVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJQU5BWm9uZSBleHRlbmRzIFpvbmUge1xuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBab25lIG5hbWVcbiAgICogQHJldHVybiB7SUFOQVpvbmV9XG4gICAqL1xuICBzdGF0aWMgY3JlYXRlKG5hbWUpIHtcbiAgICBpZiAoIWlhbmFab25lQ2FjaGVbbmFtZV0pIHtcbiAgICAgIGlhbmFab25lQ2FjaGVbbmFtZV0gPSBuZXcgSUFOQVpvbmUobmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBpYW5hWm9uZUNhY2hlW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IGxvY2FsIGNhY2hlcy4gU2hvdWxkIG9ubHkgYmUgbmVjZXNzYXJ5IGluIHRlc3Rpbmcgc2NlbmFyaW9zLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHJlc2V0Q2FjaGUoKSB7XG4gICAgaWFuYVpvbmVDYWNoZSA9IHt9O1xuICAgIGR0ZkNhY2hlID0ge307XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBwcm92aWRlZCBzdHJpbmcgaXMgYSB2YWxpZCBzcGVjaWZpZXIuIFRoaXMgb25seSBjaGVja3MgdGhlIHN0cmluZydzIGZvcm1hdCwgbm90IHRoYXQgdGhlIHNwZWNpZmllciBpZGVudGlmaWVzIGEga25vd24gem9uZTsgc2VlIGlzVmFsaWRab25lIGZvciB0aGF0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcyAtIFRoZSBzdHJpbmcgdG8gY2hlY2sgdmFsaWRpdHkgb25cbiAgICogQGV4YW1wbGUgSUFOQVpvbmUuaXNWYWxpZFNwZWNpZmllcihcIkFtZXJpY2EvTmV3X1lvcmtcIikgLy89PiB0cnVlXG4gICAqIEBleGFtcGxlIElBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIoXCJGYW50YXNpYS9DYXN0bGVcIikgLy89PiB0cnVlXG4gICAqIEBleGFtcGxlIElBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIoXCJTcG9ydH5+YmxvcnBcIikgLy89PiBmYWxzZVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGlzVmFsaWRTcGVjaWZpZXIocykge1xuICAgIHJldHVybiAhIShzICYmIHMubWF0Y2gobWF0Y2hpbmdSZWdleCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgcHJvdmlkZWQgc3RyaW5nIGlkZW50aWZpZXMgYSByZWFsIHpvbmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHpvbmUgLSBUaGUgc3RyaW5nIHRvIGNoZWNrXG4gICAqIEBleGFtcGxlIElBTkFab25lLmlzVmFsaWRab25lKFwiQW1lcmljYS9OZXdfWW9ya1wiKSAvLz0+IHRydWVcbiAgICogQGV4YW1wbGUgSUFOQVpvbmUuaXNWYWxpZFpvbmUoXCJGYW50YXNpYS9DYXN0bGVcIikgLy89PiBmYWxzZVxuICAgKiBAZXhhbXBsZSBJQU5BWm9uZS5pc1ZhbGlkWm9uZShcIlNwb3J0fn5ibG9ycFwiKSAvLz0+IGZhbHNlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBzdGF0aWMgaXNWYWxpZFpvbmUoem9uZSkge1xuICAgIHRyeSB7XG4gICAgICBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChcImVuLVVTXCIsIHsgdGltZVpvbmU6IHpvbmUgfSkuZm9ybWF0KCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gRXRjL0dNVCs4IC0+IC00ODBcbiAgLyoqIEBpZ25vcmUgKi9cbiAgc3RhdGljIHBhcnNlR01UT2Zmc2V0KHNwZWNpZmllcikge1xuICAgIGlmIChzcGVjaWZpZXIpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gc3BlY2lmaWVyLm1hdGNoKC9eRXRjXFwvR01UKDB8WystXVxcZHsxLDJ9KSQvaSk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIC02MCAqIHBhcnNlSW50KG1hdGNoWzFdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvKiogQHByaXZhdGUgKiovXG4gICAgdGhpcy56b25lTmFtZSA9IG5hbWU7XG4gICAgLyoqIEBwcml2YXRlICoqL1xuICAgIHRoaXMudmFsaWQgPSBJQU5BWm9uZS5pc1ZhbGlkWm9uZShuYW1lKTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiBcImlhbmFcIjtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnpvbmVOYW1lO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IGlzVW5pdmVyc2FsKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIG9mZnNldE5hbWUodHMsIHsgZm9ybWF0LCBsb2NhbGUgfSkge1xuICAgIHJldHVybiBwYXJzZVpvbmVJbmZvKHRzLCBmb3JtYXQsIGxvY2FsZSwgdGhpcy5uYW1lKTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGZvcm1hdE9mZnNldCh0cywgZm9ybWF0KSB7XG4gICAgcmV0dXJuIGZvcm1hdE9mZnNldCh0aGlzLm9mZnNldCh0cyksIGZvcm1hdCk7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBvZmZzZXQodHMpIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodHMpO1xuXG4gICAgaWYgKGlzTmFOKGRhdGUpKSByZXR1cm4gTmFOO1xuXG4gICAgY29uc3QgZHRmID0gbWFrZURURih0aGlzLm5hbWUpLFxuICAgICAgW3llYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kXSA9IGR0Zi5mb3JtYXRUb1BhcnRzXG4gICAgICAgID8gcGFydHNPZmZzZXQoZHRmLCBkYXRlKVxuICAgICAgICA6IGhhY2t5T2Zmc2V0KGR0ZiwgZGF0ZSk7XG5cbiAgICBjb25zdCBhc1VUQyA9IG9ialRvTG9jYWxUUyh7XG4gICAgICB5ZWFyLFxuICAgICAgbW9udGgsXG4gICAgICBkYXksXG4gICAgICBob3VyLFxuICAgICAgbWludXRlLFxuICAgICAgc2Vjb25kLFxuICAgICAgbWlsbGlzZWNvbmQ6IDAsXG4gICAgfSk7XG5cbiAgICBsZXQgYXNUUyA9ICtkYXRlO1xuICAgIGNvbnN0IG92ZXIgPSBhc1RTICUgMTAwMDtcbiAgICBhc1RTIC09IG92ZXIgPj0gMCA/IG92ZXIgOiAxMDAwICsgb3ZlcjtcbiAgICByZXR1cm4gKGFzVVRDIC0gYXNUUykgLyAoNjAgKiAxMDAwKTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICByZXR1cm4gb3RoZXJab25lLnR5cGUgPT09IFwiaWFuYVwiICYmIG90aGVyWm9uZS5uYW1lID09PSB0aGlzLm5hbWU7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy52YWxpZDtcbiAgfVxufVxuIiwgImltcG9ydCB7IGZvcm1hdE9mZnNldCwgc2lnbmVkT2Zmc2V0IH0gZnJvbSBcIi4uL2ltcGwvdXRpbC5qc1wiO1xuaW1wb3J0IFpvbmUgZnJvbSBcIi4uL3pvbmUuanNcIjtcblxubGV0IHNpbmdsZXRvbiA9IG51bGw7XG5cbi8qKlxuICogQSB6b25lIHdpdGggYSBmaXhlZCBvZmZzZXQgKG1lYW5pbmcgbm8gRFNUKVxuICogQGltcGxlbWVudHMge1pvbmV9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpeGVkT2Zmc2V0Wm9uZSBleHRlbmRzIFpvbmUge1xuICAvKipcbiAgICogR2V0IGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIFVUQ1xuICAgKiBAcmV0dXJuIHtGaXhlZE9mZnNldFpvbmV9XG4gICAqL1xuICBzdGF0aWMgZ2V0IHV0Y0luc3RhbmNlKCkge1xuICAgIGlmIChzaW5nbGV0b24gPT09IG51bGwpIHtcbiAgICAgIHNpbmdsZXRvbiA9IG5ldyBGaXhlZE9mZnNldFpvbmUoMCk7XG4gICAgfVxuICAgIHJldHVybiBzaW5nbGV0b247XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIGluc3RhbmNlIHdpdGggYSBzcGVjaWZpZWQgb2Zmc2V0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXQgLSBUaGUgb2Zmc2V0IGluIG1pbnV0ZXNcbiAgICogQHJldHVybiB7Rml4ZWRPZmZzZXRab25lfVxuICAgKi9cbiAgc3RhdGljIGluc3RhbmNlKG9mZnNldCkge1xuICAgIHJldHVybiBvZmZzZXQgPT09IDAgPyBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2UgOiBuZXcgRml4ZWRPZmZzZXRab25lKG9mZnNldCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIGluc3RhbmNlIG9mIEZpeGVkT2Zmc2V0Wm9uZSBmcm9tIGEgVVRDIG9mZnNldCBzdHJpbmcsIGxpa2UgXCJVVEMrNlwiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzIC0gVGhlIG9mZnNldCBzdHJpbmcgdG8gcGFyc2VcbiAgICogQGV4YW1wbGUgRml4ZWRPZmZzZXRab25lLnBhcnNlU3BlY2lmaWVyKFwiVVRDKzZcIilcbiAgICogQGV4YW1wbGUgRml4ZWRPZmZzZXRab25lLnBhcnNlU3BlY2lmaWVyKFwiVVRDKzA2XCIpXG4gICAqIEBleGFtcGxlIEZpeGVkT2Zmc2V0Wm9uZS5wYXJzZVNwZWNpZmllcihcIlVUQy02OjAwXCIpXG4gICAqIEByZXR1cm4ge0ZpeGVkT2Zmc2V0Wm9uZX1cbiAgICovXG4gIHN0YXRpYyBwYXJzZVNwZWNpZmllcihzKSB7XG4gICAgaWYgKHMpIHtcbiAgICAgIGNvbnN0IHIgPSBzLm1hdGNoKC9edXRjKD86KFsrLV1cXGR7MSwyfSkoPzo6KFxcZHsyfSkpPyk/JC9pKTtcbiAgICAgIGlmIChyKSB7XG4gICAgICAgIHJldHVybiBuZXcgRml4ZWRPZmZzZXRab25lKHNpZ25lZE9mZnNldChyWzFdLCByWzJdKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3RydWN0b3Iob2Zmc2V0KSB7XG4gICAgc3VwZXIoKTtcbiAgICAvKiogQHByaXZhdGUgKiovXG4gICAgdGhpcy5maXhlZCA9IG9mZnNldDtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiBcImZpeGVkXCI7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5maXhlZCA9PT0gMCA/IFwiVVRDXCIgOiBgVVRDJHtmb3JtYXRPZmZzZXQodGhpcy5maXhlZCwgXCJuYXJyb3dcIil9YDtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIG9mZnNldE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGZvcm1hdE9mZnNldCh0cywgZm9ybWF0KSB7XG4gICAgcmV0dXJuIGZvcm1hdE9mZnNldCh0aGlzLmZpeGVkLCBmb3JtYXQpO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IGlzVW5pdmVyc2FsKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgb2Zmc2V0KCkge1xuICAgIHJldHVybiB0aGlzLmZpeGVkO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZXF1YWxzKG90aGVyWm9uZSkge1xuICAgIHJldHVybiBvdGhlclpvbmUudHlwZSA9PT0gXCJmaXhlZFwiICYmIG90aGVyWm9uZS5maXhlZCA9PT0gdGhpcy5maXhlZDtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCBpc1ZhbGlkKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iLCAiaW1wb3J0IFpvbmUgZnJvbSBcIi4uL3pvbmUuanNcIjtcblxuLyoqXG4gKiBBIHpvbmUgdGhhdCBmYWlsZWQgdG8gcGFyc2UuIFlvdSBzaG91bGQgbmV2ZXIgbmVlZCB0byBpbnN0YW50aWF0ZSB0aGlzLlxuICogQGltcGxlbWVudHMge1pvbmV9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEludmFsaWRab25lIGV4dGVuZHMgWm9uZSB7XG4gIGNvbnN0cnVjdG9yKHpvbmVOYW1lKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvKiogIEBwcml2YXRlICovXG4gICAgdGhpcy56b25lTmFtZSA9IHpvbmVOYW1lO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIFwiaW52YWxpZFwiO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuem9uZU5hbWU7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgaXNVbml2ZXJzYWwoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgb2Zmc2V0TmFtZSgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGZvcm1hdE9mZnNldCgpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIG9mZnNldCgpIHtcbiAgICByZXR1cm4gTmFOO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZXF1YWxzKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCBpc1ZhbGlkKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwgIi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5pbXBvcnQgWm9uZSBmcm9tIFwiLi4vem9uZS5qc1wiO1xuaW1wb3J0IElBTkFab25lIGZyb20gXCIuLi96b25lcy9JQU5BWm9uZS5qc1wiO1xuaW1wb3J0IEZpeGVkT2Zmc2V0Wm9uZSBmcm9tIFwiLi4vem9uZXMvZml4ZWRPZmZzZXRab25lLmpzXCI7XG5pbXBvcnQgSW52YWxpZFpvbmUgZnJvbSBcIi4uL3pvbmVzL2ludmFsaWRab25lLmpzXCI7XG5cbmltcG9ydCB7IGlzVW5kZWZpbmVkLCBpc1N0cmluZywgaXNOdW1iZXIgfSBmcm9tIFwiLi91dGlsLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVab25lKGlucHV0LCBkZWZhdWx0Wm9uZSkge1xuICBsZXQgb2Zmc2V0O1xuICBpZiAoaXNVbmRlZmluZWQoaW5wdXQpIHx8IGlucHV0ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRab25lO1xuICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWm9uZSkge1xuICAgIHJldHVybiBpbnB1dDtcbiAgfSBlbHNlIGlmIChpc1N0cmluZyhpbnB1dCkpIHtcbiAgICBjb25zdCBsb3dlcmVkID0gaW5wdXQudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobG93ZXJlZCA9PT0gXCJsb2NhbFwiIHx8IGxvd2VyZWQgPT09IFwic3lzdGVtXCIpIHJldHVybiBkZWZhdWx0Wm9uZTtcbiAgICBlbHNlIGlmIChsb3dlcmVkID09PSBcInV0Y1wiIHx8IGxvd2VyZWQgPT09IFwiZ210XCIpIHJldHVybiBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2U7XG4gICAgZWxzZSBpZiAoKG9mZnNldCA9IElBTkFab25lLnBhcnNlR01UT2Zmc2V0KGlucHV0KSkgIT0gbnVsbCkge1xuICAgICAgLy8gaGFuZGxlIEV0Yy9HTVQtNCwgd2hpY2ggVjggY2hva2VzIG9uXG4gICAgICByZXR1cm4gRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKG9mZnNldCk7XG4gICAgfSBlbHNlIGlmIChJQU5BWm9uZS5pc1ZhbGlkU3BlY2lmaWVyKGxvd2VyZWQpKSByZXR1cm4gSUFOQVpvbmUuY3JlYXRlKGlucHV0KTtcbiAgICBlbHNlIHJldHVybiBGaXhlZE9mZnNldFpvbmUucGFyc2VTcGVjaWZpZXIobG93ZXJlZCkgfHwgbmV3IEludmFsaWRab25lKGlucHV0KTtcbiAgfSBlbHNlIGlmIChpc051bWJlcihpbnB1dCkpIHtcbiAgICByZXR1cm4gRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKGlucHV0KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09IFwib2JqZWN0XCIgJiYgaW5wdXQub2Zmc2V0ICYmIHR5cGVvZiBpbnB1dC5vZmZzZXQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAvLyBUaGlzIGlzIGR1bWIsIGJ1dCB0aGUgaW5zdGFuY2VvZiBjaGVjayBhYm92ZSBkb2Vzbid0IHNlZW0gdG8gcmVhbGx5IHdvcmtcbiAgICAvLyBzbyB3ZSdyZSBkdWNrIGNoZWNraW5nIGl0XG4gICAgcmV0dXJuIGlucHV0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgSW52YWxpZFpvbmUoaW5wdXQpO1xuICB9XG59XG4iLCAiaW1wb3J0IFN5c3RlbVpvbmUgZnJvbSBcIi4vem9uZXMvc3lzdGVtWm9uZS5qc1wiO1xuaW1wb3J0IElBTkFab25lIGZyb20gXCIuL3pvbmVzL0lBTkFab25lLmpzXCI7XG5pbXBvcnQgTG9jYWxlIGZyb20gXCIuL2ltcGwvbG9jYWxlLmpzXCI7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZVpvbmUgfSBmcm9tIFwiLi9pbXBsL3pvbmVVdGlsLmpzXCI7XG5cbmxldCBub3cgPSAoKSA9PiBEYXRlLm5vdygpLFxuICBkZWZhdWx0Wm9uZSA9IFwic3lzdGVtXCIsXG4gIGRlZmF1bHRMb2NhbGUgPSBudWxsLFxuICBkZWZhdWx0TnVtYmVyaW5nU3lzdGVtID0gbnVsbCxcbiAgZGVmYXVsdE91dHB1dENhbGVuZGFyID0gbnVsbCxcbiAgdGhyb3dPbkludmFsaWQ7XG5cbi8qKlxuICogU2V0dGluZ3MgY29udGFpbnMgc3RhdGljIGdldHRlcnMgYW5kIHNldHRlcnMgdGhhdCBjb250cm9sIEx1eG9uJ3Mgb3ZlcmFsbCBiZWhhdmlvci4gTHV4b24gaXMgYSBzaW1wbGUgbGlicmFyeSB3aXRoIGZldyBvcHRpb25zLCBidXQgdGhlIG9uZXMgaXQgZG9lcyBoYXZlIGxpdmUgaGVyZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2V0dGluZ3Mge1xuICAvKipcbiAgICogR2V0IHRoZSBjYWxsYmFjayBmb3IgcmV0dXJuaW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcC5cbiAgICogQHR5cGUge2Z1bmN0aW9ufVxuICAgKi9cbiAgc3RhdGljIGdldCBub3coKSB7XG4gICAgcmV0dXJuIG5vdztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGNhbGxiYWNrIGZvciByZXR1cm5pbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wLlxuICAgKiBUaGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhIG51bWJlciwgd2hpY2ggd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBhbiBFcG9jaCBtaWxsaXNlY29uZCBjb3VudFxuICAgKiBAdHlwZSB7ZnVuY3Rpb259XG4gICAqIEBleGFtcGxlIFNldHRpbmdzLm5vdyA9ICgpID0+IERhdGUubm93KCkgKyAzMDAwIC8vIHByZXRlbmQgaXQgaXMgMyBzZWNvbmRzIGluIHRoZSBmdXR1cmVcbiAgICogQGV4YW1wbGUgU2V0dGluZ3Mubm93ID0gKCkgPT4gMCAvLyBhbHdheXMgcHJldGVuZCBpdCdzIEphbiAxLCAxOTcwIGF0IG1pZG5pZ2h0IGluIFVUQyB0aW1lXG4gICAqL1xuICBzdGF0aWMgc2V0IG5vdyhuKSB7XG4gICAgbm93ID0gbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlZmF1bHQgdGltZSB6b25lIHRvIGNyZWF0ZSBEYXRlVGltZXMgaW4uIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXG4gICAqIFVzZSB0aGUgdmFsdWUgXCJzeXN0ZW1cIiB0byByZXNldCB0aGlzIHZhbHVlIHRvIHRoZSBzeXN0ZW0ncyB0aW1lIHpvbmUuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgc2V0IGRlZmF1bHRab25lKHpvbmUpIHtcbiAgICBkZWZhdWx0Wm9uZSA9IHpvbmU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkZWZhdWx0IHRpbWUgem9uZSBvYmplY3QgY3VycmVudGx5IHVzZWQgdG8gY3JlYXRlIERhdGVUaW1lcy4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgdGhlIHN5c3RlbSdzIHRpbWUgem9uZSAodGhlIG9uZSBzZXQgb24gdGhlIG1hY2hpbmUgdGhhdCBydW5zIHRoaXMgY29kZSkuXG4gICAqIEB0eXBlIHtab25lfVxuICAgKi9cbiAgc3RhdGljIGdldCBkZWZhdWx0Wm9uZSgpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplWm9uZShkZWZhdWx0Wm9uZSwgU3lzdGVtWm9uZS5pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkZWZhdWx0IGxvY2FsZSB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgZ2V0IGRlZmF1bHRMb2NhbGUoKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRMb2NhbGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBkZWZhdWx0IGxvY2FsZSB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgc2V0IGRlZmF1bHRMb2NhbGUobG9jYWxlKSB7XG4gICAgZGVmYXVsdExvY2FsZSA9IGxvY2FsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRlZmF1bHQgbnVtYmVyaW5nIHN5c3RlbSB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgZ2V0IGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0oKSB7XG4gICAgcmV0dXJuIGRlZmF1bHROdW1iZXJpbmdTeXN0ZW07XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBkZWZhdWx0IG51bWJlcmluZyBzeXN0ZW0gdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgc3RhdGljIHNldCBkZWZhdWx0TnVtYmVyaW5nU3lzdGVtKG51bWJlcmluZ1N5c3RlbSkge1xuICAgIGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0gPSBudW1iZXJpbmdTeXN0ZW07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkZWZhdWx0IG91dHB1dCBjYWxlbmRhciB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgZ2V0IGRlZmF1bHRPdXRwdXRDYWxlbmRhcigpIHtcbiAgICByZXR1cm4gZGVmYXVsdE91dHB1dENhbGVuZGFyO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZGVmYXVsdCBvdXRwdXQgY2FsZW5kYXIgdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgc3RhdGljIHNldCBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIob3V0cHV0Q2FsZW5kYXIpIHtcbiAgICBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIgPSBvdXRwdXRDYWxlbmRhcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgd2hldGhlciBMdXhvbiB3aWxsIHRocm93IHdoZW4gaXQgZW5jb3VudGVycyBpbnZhbGlkIERhdGVUaW1lcywgRHVyYXRpb25zLCBvciBJbnRlcnZhbHNcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBzdGF0aWMgZ2V0IHRocm93T25JbnZhbGlkKCkge1xuICAgIHJldHVybiB0aHJvd09uSW52YWxpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgd2hldGhlciBMdXhvbiB3aWxsIHRocm93IHdoZW4gaXQgZW5jb3VudGVycyBpbnZhbGlkIERhdGVUaW1lcywgRHVyYXRpb25zLCBvciBJbnRlcnZhbHNcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBzdGF0aWMgc2V0IHRocm93T25JbnZhbGlkKHQpIHtcbiAgICB0aHJvd09uSW52YWxpZCA9IHQ7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgTHV4b24ncyBnbG9iYWwgY2FjaGVzLiBTaG91bGQgb25seSBiZSBuZWNlc3NhcnkgaW4gdGVzdGluZyBzY2VuYXJpb3MuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgcmVzZXRDYWNoZXMoKSB7XG4gICAgTG9jYWxlLnJlc2V0Q2FjaGUoKTtcbiAgICBJQU5BWm9uZS5yZXNldENhY2hlKCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBwYWRTdGFydCwgcm91bmRUbywgaGFzUmVsYXRpdmUgfSBmcm9tIFwiLi91dGlsLmpzXCI7XG5pbXBvcnQgKiBhcyBFbmdsaXNoIGZyb20gXCIuL2VuZ2xpc2guanNcIjtcbmltcG9ydCBTZXR0aW5ncyBmcm9tIFwiLi4vc2V0dGluZ3MuanNcIjtcbmltcG9ydCBEYXRlVGltZSBmcm9tIFwiLi4vZGF0ZXRpbWUuanNcIjtcbmltcG9ydCBJQU5BWm9uZSBmcm9tIFwiLi4vem9uZXMvSUFOQVpvbmUuanNcIjtcblxubGV0IGludGxEVENhY2hlID0ge307XG5mdW5jdGlvbiBnZXRDYWNoZWREVEYobG9jU3RyaW5nLCBvcHRzID0ge30pIHtcbiAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkoW2xvY1N0cmluZywgb3B0c10pO1xuICBsZXQgZHRmID0gaW50bERUQ2FjaGVba2V5XTtcbiAgaWYgKCFkdGYpIHtcbiAgICBkdGYgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NTdHJpbmcsIG9wdHMpO1xuICAgIGludGxEVENhY2hlW2tleV0gPSBkdGY7XG4gIH1cbiAgcmV0dXJuIGR0Zjtcbn1cblxubGV0IGludGxOdW1DYWNoZSA9IHt9O1xuZnVuY3Rpb24gZ2V0Q2FjaGVkSU5GKGxvY1N0cmluZywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KFtsb2NTdHJpbmcsIG9wdHNdKTtcbiAgbGV0IGluZiA9IGludGxOdW1DYWNoZVtrZXldO1xuICBpZiAoIWluZikge1xuICAgIGluZiA9IG5ldyBJbnRsLk51bWJlckZvcm1hdChsb2NTdHJpbmcsIG9wdHMpO1xuICAgIGludGxOdW1DYWNoZVtrZXldID0gaW5mO1xuICB9XG4gIHJldHVybiBpbmY7XG59XG5cbmxldCBpbnRsUmVsQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGdldENhY2hlZFJURihsb2NTdHJpbmcsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGJhc2UsIC4uLmNhY2hlS2V5T3B0cyB9ID0gb3B0czsgLy8gZXhjbHVkZSBgYmFzZWAgZnJvbSB0aGUgb3B0aW9uc1xuICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShbbG9jU3RyaW5nLCBjYWNoZUtleU9wdHNdKTtcbiAgbGV0IGluZiA9IGludGxSZWxDYWNoZVtrZXldO1xuICBpZiAoIWluZikge1xuICAgIGluZiA9IG5ldyBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdChsb2NTdHJpbmcsIG9wdHMpO1xuICAgIGludGxSZWxDYWNoZVtrZXldID0gaW5mO1xuICB9XG4gIHJldHVybiBpbmY7XG59XG5cbmxldCBzeXNMb2NhbGVDYWNoZSA9IG51bGw7XG5mdW5jdGlvbiBzeXN0ZW1Mb2NhbGUoKSB7XG4gIGlmIChzeXNMb2NhbGVDYWNoZSkge1xuICAgIHJldHVybiBzeXNMb2NhbGVDYWNoZTtcbiAgfSBlbHNlIHtcbiAgICBzeXNMb2NhbGVDYWNoZSA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlO1xuICAgIHJldHVybiBzeXNMb2NhbGVDYWNoZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUxvY2FsZVN0cmluZyhsb2NhbGVTdHIpIHtcbiAgLy8gSSByZWFsbHkgd2FudCB0byBhdm9pZCB3cml0aW5nIGEgQkNQIDQ3IHBhcnNlclxuICAvLyBzZWUsIGUuZy4gaHR0cHM6Ly9naXRodWIuY29tL3dvb29ybS9iY3AtNDdcbiAgLy8gSW5zdGVhZCwgd2UnbGwgZG8gdGhpczpcblxuICAvLyBhKSBpZiB0aGUgc3RyaW5nIGhhcyBubyAtdSBleHRlbnNpb25zLCBqdXN0IGxlYXZlIGl0IGFsb25lXG4gIC8vIGIpIGlmIGl0IGRvZXMsIHVzZSBJbnRsIHRvIHJlc29sdmUgZXZlcnl0aGluZ1xuICAvLyBjKSBpZiBJbnRsIGZhaWxzLCB0cnkgYWdhaW4gd2l0aG91dCB0aGUgLXVcblxuICBjb25zdCB1SW5kZXggPSBsb2NhbGVTdHIuaW5kZXhPZihcIi11LVwiKTtcbiAgaWYgKHVJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gW2xvY2FsZVN0cl07XG4gIH0gZWxzZSB7XG4gICAgbGV0IG9wdGlvbnM7XG4gICAgY29uc3Qgc21hbGxlciA9IGxvY2FsZVN0ci5zdWJzdHJpbmcoMCwgdUluZGV4KTtcbiAgICB0cnkge1xuICAgICAgb3B0aW9ucyA9IGdldENhY2hlZERURihsb2NhbGVTdHIpLnJlc29sdmVkT3B0aW9ucygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG9wdGlvbnMgPSBnZXRDYWNoZWREVEYoc21hbGxlcikucmVzb2x2ZWRPcHRpb25zKCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBudW1iZXJpbmdTeXN0ZW0sIGNhbGVuZGFyIH0gPSBvcHRpb25zO1xuICAgIC8vIHJldHVybiB0aGUgc21hbGxlciBvbmUgc28gdGhhdCB3ZSBjYW4gYXBwZW5kIHRoZSBjYWxlbmRhciBhbmQgbnVtYmVyaW5nIG92ZXJyaWRlcyB0byBpdFxuICAgIHJldHVybiBbc21hbGxlciwgbnVtYmVyaW5nU3lzdGVtLCBjYWxlbmRhcl07XG4gIH1cbn1cblxuZnVuY3Rpb24gaW50bENvbmZpZ1N0cmluZyhsb2NhbGVTdHIsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpIHtcbiAgaWYgKG91dHB1dENhbGVuZGFyIHx8IG51bWJlcmluZ1N5c3RlbSkge1xuICAgIGxvY2FsZVN0ciArPSBcIi11XCI7XG5cbiAgICBpZiAob3V0cHV0Q2FsZW5kYXIpIHtcbiAgICAgIGxvY2FsZVN0ciArPSBgLWNhLSR7b3V0cHV0Q2FsZW5kYXJ9YDtcbiAgICB9XG5cbiAgICBpZiAobnVtYmVyaW5nU3lzdGVtKSB7XG4gICAgICBsb2NhbGVTdHIgKz0gYC1udS0ke251bWJlcmluZ1N5c3RlbX1gO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxlU3RyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsb2NhbGVTdHI7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFwTW9udGhzKGYpIHtcbiAgY29uc3QgbXMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPD0gMTI7IGkrKykge1xuICAgIGNvbnN0IGR0ID0gRGF0ZVRpbWUudXRjKDIwMTYsIGksIDEpO1xuICAgIG1zLnB1c2goZihkdCkpO1xuICB9XG4gIHJldHVybiBtcztcbn1cblxuZnVuY3Rpb24gbWFwV2Vla2RheXMoZikge1xuICBjb25zdCBtcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMTsgaSA8PSA3OyBpKyspIHtcbiAgICBjb25zdCBkdCA9IERhdGVUaW1lLnV0YygyMDE2LCAxMSwgMTMgKyBpKTtcbiAgICBtcy5wdXNoKGYoZHQpKTtcbiAgfVxuICByZXR1cm4gbXM7XG59XG5cbmZ1bmN0aW9uIGxpc3RTdHVmZihsb2MsIGxlbmd0aCwgZGVmYXVsdE9LLCBlbmdsaXNoRm4sIGludGxGbikge1xuICBjb25zdCBtb2RlID0gbG9jLmxpc3RpbmdNb2RlKGRlZmF1bHRPSyk7XG5cbiAgaWYgKG1vZGUgPT09IFwiZXJyb3JcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKG1vZGUgPT09IFwiZW5cIikge1xuICAgIHJldHVybiBlbmdsaXNoRm4obGVuZ3RoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaW50bEZuKGxlbmd0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNGYXN0TnVtYmVycyhsb2MpIHtcbiAgaWYgKGxvYy5udW1iZXJpbmdTeXN0ZW0gJiYgbG9jLm51bWJlcmluZ1N5c3RlbSAhPT0gXCJsYXRuXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGxvYy5udW1iZXJpbmdTeXN0ZW0gPT09IFwibGF0blwiIHx8XG4gICAgICAhbG9jLmxvY2FsZSB8fFxuICAgICAgbG9jLmxvY2FsZS5zdGFydHNXaXRoKFwiZW5cIikgfHxcbiAgICAgIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvYy5pbnRsKS5yZXNvbHZlZE9wdGlvbnMoKS5udW1iZXJpbmdTeXN0ZW0gPT09IFwibGF0blwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuY2xhc3MgUG9seU51bWJlckZvcm1hdHRlciB7XG4gIGNvbnN0cnVjdG9yKGludGwsIGZvcmNlU2ltcGxlLCBvcHRzKSB7XG4gICAgdGhpcy5wYWRUbyA9IG9wdHMucGFkVG8gfHwgMDtcbiAgICB0aGlzLmZsb29yID0gb3B0cy5mbG9vciB8fCBmYWxzZTtcblxuICAgIGlmICghZm9yY2VTaW1wbGUpIHtcbiAgICAgIGNvbnN0IGludGxPcHRzID0geyB1c2VHcm91cGluZzogZmFsc2UgfTtcbiAgICAgIGlmIChvcHRzLnBhZFRvID4gMCkgaW50bE9wdHMubWluaW11bUludGVnZXJEaWdpdHMgPSBvcHRzLnBhZFRvO1xuICAgICAgdGhpcy5pbmYgPSBnZXRDYWNoZWRJTkYoaW50bCwgaW50bE9wdHMpO1xuICAgIH1cbiAgfVxuXG4gIGZvcm1hdChpKSB7XG4gICAgaWYgKHRoaXMuaW5mKSB7XG4gICAgICBjb25zdCBmaXhlZCA9IHRoaXMuZmxvb3IgPyBNYXRoLmZsb29yKGkpIDogaTtcbiAgICAgIHJldHVybiB0aGlzLmluZi5mb3JtYXQoZml4ZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0byBtYXRjaCB0aGUgYnJvd3NlcidzIG51bWJlcmZvcm1hdHRlciBkZWZhdWx0c1xuICAgICAgY29uc3QgZml4ZWQgPSB0aGlzLmZsb29yID8gTWF0aC5mbG9vcihpKSA6IHJvdW5kVG8oaSwgMyk7XG4gICAgICByZXR1cm4gcGFkU3RhcnQoZml4ZWQsIHRoaXMucGFkVG8pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuY2xhc3MgUG9seURhdGVGb3JtYXR0ZXIge1xuICBjb25zdHJ1Y3RvcihkdCwgaW50bCwgb3B0cykge1xuICAgIHRoaXMub3B0cyA9IG9wdHM7XG5cbiAgICBsZXQgejtcbiAgICBpZiAoZHQuem9uZS5pc1VuaXZlcnNhbCkge1xuICAgICAgLy8gVVRDLTggb3IgRXRjL1VUQy04IGFyZSBub3QgcGFydCBvZiB0emRhdGEsIG9ubHkgRXRjL0dNVCs4IGFuZCB0aGUgbGlrZS5cbiAgICAgIC8vIFRoYXQgaXMgd2h5IGZpeGVkLW9mZnNldCBUWiBpcyBzZXQgdG8gdGhhdCB1bmxlc3MgaXQgaXM6XG4gICAgICAvLyAxLiBSZXByZXNlbnRpbmcgb2Zmc2V0IDAgd2hlbiBVVEMgaXMgdXNlZCB0byBtYWludGFpbiBwcmV2aW91cyBiZWhhdmlvciBhbmQgZG9lcyBub3QgYmVjb21lIEdNVC5cbiAgICAgIC8vIDIuIFVuc3VwcG9ydGVkIGJ5IHRoZSBicm93c2VyOlxuICAgICAgLy8gICAgLSBzb21lIGRvIG5vdCBzdXBwb3J0IEV0Yy9cbiAgICAgIC8vICAgIC0gPCBFdGMvR01ULTE0LCA+IEV0Yy9HTVQrMTIsIGFuZCAzMC1taW51dGUgb3IgNDUtbWludXRlIG9mZnNldHMgYXJlIG5vdCBwYXJ0IG9mIHR6ZGF0YVxuICAgICAgY29uc3QgZ210T2Zmc2V0ID0gLTEgKiAoZHQub2Zmc2V0IC8gNjApO1xuICAgICAgY29uc3Qgb2Zmc2V0WiA9IGdtdE9mZnNldCA+PSAwID8gYEV0Yy9HTVQrJHtnbXRPZmZzZXR9YCA6IGBFdGMvR01UJHtnbXRPZmZzZXR9YDtcbiAgICAgIGNvbnN0IGlzT2Zmc2V0Wm9uZVN1cHBvcnRlZCA9IElBTkFab25lLmlzVmFsaWRab25lKG9mZnNldFopO1xuICAgICAgaWYgKGR0Lm9mZnNldCAhPT0gMCAmJiBpc09mZnNldFpvbmVTdXBwb3J0ZWQpIHtcbiAgICAgICAgeiA9IG9mZnNldFo7XG4gICAgICAgIHRoaXMuZHQgPSBkdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vdCBhbGwgZml4ZWQtb2Zmc2V0IHpvbmVzIGxpa2UgRXRjLys0OjMwIGFyZSBwcmVzZW50IGluIHR6ZGF0YS5cbiAgICAgICAgLy8gU28gd2UgaGF2ZSB0byBtYWtlIGRvLiBUd28gY2FzZXM6XG4gICAgICAgIC8vIDEuIFRoZSBmb3JtYXQgb3B0aW9ucyB0ZWxsIHVzIHRvIHNob3cgdGhlIHpvbmUuIFdlIGNhbid0IGRvIHRoYXQsIHNvIHRoZSBiZXN0XG4gICAgICAgIC8vIHdlIGNhbiBkbyBpcyBmb3JtYXQgdGhlIGRhdGUgaW4gVVRDLlxuICAgICAgICAvLyAyLiBUaGUgZm9ybWF0IG9wdGlvbnMgZG9uJ3QgdGVsbCB1cyB0byBzaG93IHRoZSB6b25lLiBUaGVuIHdlIGNhbiBhZGp1c3QgdGhlbVxuICAgICAgICAvLyB0aGUgdGltZSBhbmQgdGVsbCB0aGUgZm9ybWF0dGVyIHRvIHNob3cgaXQgdG8gdXMgaW4gVVRDLCBzbyB0aGF0IHRoZSB0aW1lIGlzIHJpZ2h0XG4gICAgICAgIC8vIGFuZCB0aGUgYmFkIHpvbmUgZG9lc24ndCBzaG93IHVwLlxuICAgICAgICB6ID0gXCJVVENcIjtcbiAgICAgICAgaWYgKG9wdHMudGltZVpvbmVOYW1lKSB7XG4gICAgICAgICAgdGhpcy5kdCA9IGR0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZHQgPSBkdC5vZmZzZXQgPT09IDAgPyBkdCA6IERhdGVUaW1lLmZyb21NaWxsaXMoZHQudHMgKyBkdC5vZmZzZXQgKiA2MCAqIDEwMDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkdC56b25lLnR5cGUgPT09IFwic3lzdGVtXCIpIHtcbiAgICAgIHRoaXMuZHQgPSBkdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kdCA9IGR0O1xuICAgICAgeiA9IGR0LnpvbmUubmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRsT3B0cyA9IHsgLi4udGhpcy5vcHRzIH07XG4gICAgaWYgKHopIHtcbiAgICAgIGludGxPcHRzLnRpbWVab25lID0gejtcbiAgICB9XG4gICAgdGhpcy5kdGYgPSBnZXRDYWNoZWREVEYoaW50bCwgaW50bE9wdHMpO1xuICB9XG5cbiAgZm9ybWF0KCkge1xuICAgIHJldHVybiB0aGlzLmR0Zi5mb3JtYXQodGhpcy5kdC50b0pTRGF0ZSgpKTtcbiAgfVxuXG4gIGZvcm1hdFRvUGFydHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZHRmLmZvcm1hdFRvUGFydHModGhpcy5kdC50b0pTRGF0ZSgpKTtcbiAgfVxuXG4gIHJlc29sdmVkT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5kdGYucmVzb2x2ZWRPcHRpb25zKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBQb2x5UmVsRm9ybWF0dGVyIHtcbiAgY29uc3RydWN0b3IoaW50bCwgaXNFbmdsaXNoLCBvcHRzKSB7XG4gICAgdGhpcy5vcHRzID0geyBzdHlsZTogXCJsb25nXCIsIC4uLm9wdHMgfTtcbiAgICBpZiAoIWlzRW5nbGlzaCAmJiBoYXNSZWxhdGl2ZSgpKSB7XG4gICAgICB0aGlzLnJ0ZiA9IGdldENhY2hlZFJURihpbnRsLCBvcHRzKTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXQoY291bnQsIHVuaXQpIHtcbiAgICBpZiAodGhpcy5ydGYpIHtcbiAgICAgIHJldHVybiB0aGlzLnJ0Zi5mb3JtYXQoY291bnQsIHVuaXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRW5nbGlzaC5mb3JtYXRSZWxhdGl2ZVRpbWUodW5pdCwgY291bnQsIHRoaXMub3B0cy5udW1lcmljLCB0aGlzLm9wdHMuc3R5bGUgIT09IFwibG9uZ1wiKTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXRUb1BhcnRzKGNvdW50LCB1bml0KSB7XG4gICAgaWYgKHRoaXMucnRmKSB7XG4gICAgICByZXR1cm4gdGhpcy5ydGYuZm9ybWF0VG9QYXJ0cyhjb3VudCwgdW5pdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvY2FsZSB7XG4gIHN0YXRpYyBmcm9tT3B0cyhvcHRzKSB7XG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUob3B0cy5sb2NhbGUsIG9wdHMubnVtYmVyaW5nU3lzdGVtLCBvcHRzLm91dHB1dENhbGVuZGFyLCBvcHRzLmRlZmF1bHRUb0VOKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyLCBkZWZhdWx0VG9FTiA9IGZhbHNlKSB7XG4gICAgY29uc3Qgc3BlY2lmaWVkTG9jYWxlID0gbG9jYWxlIHx8IFNldHRpbmdzLmRlZmF1bHRMb2NhbGU7XG4gICAgLy8gdGhlIHN5c3RlbSBsb2NhbGUgaXMgdXNlZnVsIGZvciBodW1hbiByZWFkYWJsZSBzdHJpbmdzIGJ1dCBhbm5veWluZyBmb3IgcGFyc2luZy9mb3JtYXR0aW5nIGtub3duIGZvcm1hdHNcbiAgICBjb25zdCBsb2NhbGVSID0gc3BlY2lmaWVkTG9jYWxlIHx8IChkZWZhdWx0VG9FTiA/IFwiZW4tVVNcIiA6IHN5c3RlbUxvY2FsZSgpKTtcbiAgICBjb25zdCBudW1iZXJpbmdTeXN0ZW1SID0gbnVtYmVyaW5nU3lzdGVtIHx8IFNldHRpbmdzLmRlZmF1bHROdW1iZXJpbmdTeXN0ZW07XG4gICAgY29uc3Qgb3V0cHV0Q2FsZW5kYXJSID0gb3V0cHV0Q2FsZW5kYXIgfHwgU2V0dGluZ3MuZGVmYXVsdE91dHB1dENhbGVuZGFyO1xuICAgIHJldHVybiBuZXcgTG9jYWxlKGxvY2FsZVIsIG51bWJlcmluZ1N5c3RlbVIsIG91dHB1dENhbGVuZGFyUiwgc3BlY2lmaWVkTG9jYWxlKTtcbiAgfVxuXG4gIHN0YXRpYyByZXNldENhY2hlKCkge1xuICAgIHN5c0xvY2FsZUNhY2hlID0gbnVsbDtcbiAgICBpbnRsRFRDYWNoZSA9IHt9O1xuICAgIGludGxOdW1DYWNoZSA9IHt9O1xuICAgIGludGxSZWxDYWNoZSA9IHt9O1xuICB9XG5cbiAgc3RhdGljIGZyb21PYmplY3QoeyBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIgfSA9IHt9KSB7XG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGxvY2FsZSwgbnVtYmVyaW5nLCBvdXRwdXRDYWxlbmRhciwgc3BlY2lmaWVkTG9jYWxlKSB7XG4gICAgY29uc3QgW3BhcnNlZExvY2FsZSwgcGFyc2VkTnVtYmVyaW5nU3lzdGVtLCBwYXJzZWRPdXRwdXRDYWxlbmRhcl0gPSBwYXJzZUxvY2FsZVN0cmluZyhsb2NhbGUpO1xuXG4gICAgdGhpcy5sb2NhbGUgPSBwYXJzZWRMb2NhbGU7XG4gICAgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPSBudW1iZXJpbmcgfHwgcGFyc2VkTnVtYmVyaW5nU3lzdGVtIHx8IG51bGw7XG4gICAgdGhpcy5vdXRwdXRDYWxlbmRhciA9IG91dHB1dENhbGVuZGFyIHx8IHBhcnNlZE91dHB1dENhbGVuZGFyIHx8IG51bGw7XG4gICAgdGhpcy5pbnRsID0gaW50bENvbmZpZ1N0cmluZyh0aGlzLmxvY2FsZSwgdGhpcy5udW1iZXJpbmdTeXN0ZW0sIHRoaXMub3V0cHV0Q2FsZW5kYXIpO1xuXG4gICAgdGhpcy53ZWVrZGF5c0NhY2hlID0geyBmb3JtYXQ6IHt9LCBzdGFuZGFsb25lOiB7fSB9O1xuICAgIHRoaXMubW9udGhzQ2FjaGUgPSB7IGZvcm1hdDoge30sIHN0YW5kYWxvbmU6IHt9IH07XG4gICAgdGhpcy5tZXJpZGllbUNhY2hlID0gbnVsbDtcbiAgICB0aGlzLmVyYUNhY2hlID0ge307XG5cbiAgICB0aGlzLnNwZWNpZmllZExvY2FsZSA9IHNwZWNpZmllZExvY2FsZTtcbiAgICB0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkID0gbnVsbDtcbiAgfVxuXG4gIGdldCBmYXN0TnVtYmVycygpIHtcbiAgICBpZiAodGhpcy5mYXN0TnVtYmVyc0NhY2hlZCA9PSBudWxsKSB7XG4gICAgICB0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkID0gc3VwcG9ydHNGYXN0TnVtYmVycyh0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mYXN0TnVtYmVyc0NhY2hlZDtcbiAgfVxuXG4gIGxpc3RpbmdNb2RlKGRlZmF1bHRPSyA9IHRydWUpIHtcbiAgICBjb25zdCBpc0FjdHVhbGx5RW4gPSB0aGlzLmlzRW5nbGlzaCgpO1xuICAgIGNvbnN0IGhhc05vV2VpcmRuZXNzID1cbiAgICAgICh0aGlzLm51bWJlcmluZ1N5c3RlbSA9PT0gbnVsbCB8fCB0aGlzLm51bWJlcmluZ1N5c3RlbSA9PT0gXCJsYXRuXCIpICYmXG4gICAgICAodGhpcy5vdXRwdXRDYWxlbmRhciA9PT0gbnVsbCB8fCB0aGlzLm91dHB1dENhbGVuZGFyID09PSBcImdyZWdvcnlcIik7XG4gICAgcmV0dXJuIGlzQWN0dWFsbHlFbiAmJiBoYXNOb1dlaXJkbmVzcyA/IFwiZW5cIiA6IFwiaW50bFwiO1xuICB9XG5cbiAgY2xvbmUoYWx0cykge1xuICAgIGlmICghYWx0cyB8fCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhbHRzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShcbiAgICAgICAgYWx0cy5sb2NhbGUgfHwgdGhpcy5zcGVjaWZpZWRMb2NhbGUsXG4gICAgICAgIGFsdHMubnVtYmVyaW5nU3lzdGVtIHx8IHRoaXMubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBhbHRzLm91dHB1dENhbGVuZGFyIHx8IHRoaXMub3V0cHV0Q2FsZW5kYXIsXG4gICAgICAgIGFsdHMuZGVmYXVsdFRvRU4gfHwgZmFsc2VcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmVkZWZhdWx0VG9FTihhbHRzID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSh7IC4uLmFsdHMsIGRlZmF1bHRUb0VOOiB0cnVlIH0pO1xuICB9XG5cbiAgcmVkZWZhdWx0VG9TeXN0ZW0oYWx0cyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoeyAuLi5hbHRzLCBkZWZhdWx0VG9FTjogZmFsc2UgfSk7XG4gIH1cblxuICBtb250aHMobGVuZ3RoLCBmb3JtYXQgPSBmYWxzZSwgZGVmYXVsdE9LID0gdHJ1ZSkge1xuICAgIHJldHVybiBsaXN0U3R1ZmYodGhpcywgbGVuZ3RoLCBkZWZhdWx0T0ssIEVuZ2xpc2gubW9udGhzLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnRsID0gZm9ybWF0ID8geyBtb250aDogbGVuZ3RoLCBkYXk6IFwibnVtZXJpY1wiIH0gOiB7IG1vbnRoOiBsZW5ndGggfSxcbiAgICAgICAgZm9ybWF0U3RyID0gZm9ybWF0ID8gXCJmb3JtYXRcIiA6IFwic3RhbmRhbG9uZVwiO1xuICAgICAgaWYgKCF0aGlzLm1vbnRoc0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXSkge1xuICAgICAgICB0aGlzLm1vbnRoc0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXSA9IG1hcE1vbnRocygoZHQpID0+IHRoaXMuZXh0cmFjdChkdCwgaW50bCwgXCJtb250aFwiKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5tb250aHNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF07XG4gICAgfSk7XG4gIH1cblxuICB3ZWVrZGF5cyhsZW5ndGgsIGZvcm1hdCA9IGZhbHNlLCBkZWZhdWx0T0sgPSB0cnVlKSB7XG4gICAgcmV0dXJuIGxpc3RTdHVmZih0aGlzLCBsZW5ndGgsIGRlZmF1bHRPSywgRW5nbGlzaC53ZWVrZGF5cywgKCkgPT4ge1xuICAgICAgY29uc3QgaW50bCA9IGZvcm1hdFxuICAgICAgICAgID8geyB3ZWVrZGF5OiBsZW5ndGgsIHllYXI6IFwibnVtZXJpY1wiLCBtb250aDogXCJsb25nXCIsIGRheTogXCJudW1lcmljXCIgfVxuICAgICAgICAgIDogeyB3ZWVrZGF5OiBsZW5ndGggfSxcbiAgICAgICAgZm9ybWF0U3RyID0gZm9ybWF0ID8gXCJmb3JtYXRcIiA6IFwic3RhbmRhbG9uZVwiO1xuICAgICAgaWYgKCF0aGlzLndlZWtkYXlzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdKSB7XG4gICAgICAgIHRoaXMud2Vla2RheXNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF0gPSBtYXBXZWVrZGF5cygoZHQpID0+XG4gICAgICAgICAgdGhpcy5leHRyYWN0KGR0LCBpbnRsLCBcIndlZWtkYXlcIilcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLndlZWtkYXlzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdO1xuICAgIH0pO1xuICB9XG5cbiAgbWVyaWRpZW1zKGRlZmF1bHRPSyA9IHRydWUpIHtcbiAgICByZXR1cm4gbGlzdFN0dWZmKFxuICAgICAgdGhpcyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGRlZmF1bHRPSyxcbiAgICAgICgpID0+IEVuZ2xpc2gubWVyaWRpZW1zLFxuICAgICAgKCkgPT4ge1xuICAgICAgICAvLyBJbiB0aGVvcnkgdGhlcmUgY291bGQgYmUgYXJpYml0cmFyeSBkYXkgcGVyaW9kcy4gV2UncmUgZ29ubmEgYXNzdW1lIHRoZXJlIGFyZSBleGFjdGx5IHR3b1xuICAgICAgICAvLyBmb3IgQU0gYW5kIFBNLiBUaGlzIGlzIHByb2JhYmx5IHdyb25nLCBidXQgaXQncyBtYWtlcyBwYXJzaW5nIHdheSBlYXNpZXIuXG4gICAgICAgIGlmICghdGhpcy5tZXJpZGllbUNhY2hlKSB7XG4gICAgICAgICAgY29uc3QgaW50bCA9IHsgaG91cjogXCJudW1lcmljXCIsIGhvdXJDeWNsZTogXCJoMTJcIiB9O1xuICAgICAgICAgIHRoaXMubWVyaWRpZW1DYWNoZSA9IFtEYXRlVGltZS51dGMoMjAxNiwgMTEsIDEzLCA5KSwgRGF0ZVRpbWUudXRjKDIwMTYsIDExLCAxMywgMTkpXS5tYXAoXG4gICAgICAgICAgICAoZHQpID0+IHRoaXMuZXh0cmFjdChkdCwgaW50bCwgXCJkYXlwZXJpb2RcIilcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubWVyaWRpZW1DYWNoZTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgZXJhcyhsZW5ndGgsIGRlZmF1bHRPSyA9IHRydWUpIHtcbiAgICByZXR1cm4gbGlzdFN0dWZmKHRoaXMsIGxlbmd0aCwgZGVmYXVsdE9LLCBFbmdsaXNoLmVyYXMsICgpID0+IHtcbiAgICAgIGNvbnN0IGludGwgPSB7IGVyYTogbGVuZ3RoIH07XG5cbiAgICAgIC8vIFRoaXMgaXMgcHJvYmxlbWF0aWMuIERpZmZlcmVudCBjYWxlbmRhcnMgYXJlIGdvaW5nIHRvIGRlZmluZSBlcmFzIHRvdGFsbHkgZGlmZmVyZW50bHkuIFdoYXQgSSBuZWVkIGlzIHRoZSBtaW5pbXVtIHNldCBvZiBkYXRlc1xuICAgICAgLy8gdG8gZGVmaW5pdGVseSBlbnVtZXJhdGUgdGhlbS5cbiAgICAgIGlmICghdGhpcy5lcmFDYWNoZVtsZW5ndGhdKSB7XG4gICAgICAgIHRoaXMuZXJhQ2FjaGVbbGVuZ3RoXSA9IFtEYXRlVGltZS51dGMoLTQwLCAxLCAxKSwgRGF0ZVRpbWUudXRjKDIwMTcsIDEsIDEpXS5tYXAoKGR0KSA9PlxuICAgICAgICAgIHRoaXMuZXh0cmFjdChkdCwgaW50bCwgXCJlcmFcIilcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZXJhQ2FjaGVbbGVuZ3RoXTtcbiAgICB9KTtcbiAgfVxuXG4gIGV4dHJhY3QoZHQsIGludGxPcHRzLCBmaWVsZCkge1xuICAgIGNvbnN0IGRmID0gdGhpcy5kdEZvcm1hdHRlcihkdCwgaW50bE9wdHMpLFxuICAgICAgcmVzdWx0cyA9IGRmLmZvcm1hdFRvUGFydHMoKSxcbiAgICAgIG1hdGNoaW5nID0gcmVzdWx0cy5maW5kKChtKSA9PiBtLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gZmllbGQpO1xuICAgIHJldHVybiBtYXRjaGluZyA/IG1hdGNoaW5nLnZhbHVlIDogbnVsbDtcbiAgfVxuXG4gIG51bWJlckZvcm1hdHRlcihvcHRzID0ge30pIHtcbiAgICAvLyB0aGlzIGZvcmNlc2ltcGxlIG9wdGlvbiBpcyBuZXZlciB1c2VkICh0aGUgb25seSBjYWxsZXIgc2hvcnQtY2lyY3VpdHMgb24gaXQsIGJ1dCBpdCBzZWVtcyBzYWZlciB0byBsZWF2ZSlcbiAgICAvLyAoaW4gY29udHJhc3QsIHRoZSByZXN0IG9mIHRoZSBjb25kaXRpb24gaXMgdXNlZCBoZWF2aWx5KVxuICAgIHJldHVybiBuZXcgUG9seU51bWJlckZvcm1hdHRlcih0aGlzLmludGwsIG9wdHMuZm9yY2VTaW1wbGUgfHwgdGhpcy5mYXN0TnVtYmVycywgb3B0cyk7XG4gIH1cblxuICBkdEZvcm1hdHRlcihkdCwgaW50bE9wdHMgPSB7fSkge1xuICAgIHJldHVybiBuZXcgUG9seURhdGVGb3JtYXR0ZXIoZHQsIHRoaXMuaW50bCwgaW50bE9wdHMpO1xuICB9XG5cbiAgcmVsRm9ybWF0dGVyKG9wdHMgPSB7fSkge1xuICAgIHJldHVybiBuZXcgUG9seVJlbEZvcm1hdHRlcih0aGlzLmludGwsIHRoaXMuaXNFbmdsaXNoKCksIG9wdHMpO1xuICB9XG5cbiAgaXNFbmdsaXNoKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmxvY2FsZSA9PT0gXCJlblwiIHx8XG4gICAgICB0aGlzLmxvY2FsZS50b0xvd2VyQ2FzZSgpID09PSBcImVuLXVzXCIgfHxcbiAgICAgIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMuaW50bCkucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlLnN0YXJ0c1dpdGgoXCJlbi11c1wiKVxuICAgICk7XG4gIH1cblxuICBlcXVhbHMob3RoZXIpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5sb2NhbGUgPT09IG90aGVyLmxvY2FsZSAmJlxuICAgICAgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPT09IG90aGVyLm51bWJlcmluZ1N5c3RlbSAmJlxuICAgICAgdGhpcy5vdXRwdXRDYWxlbmRhciA9PT0gb3RoZXIub3V0cHV0Q2FsZW5kYXJcbiAgICApO1xuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgdW50cnVuY2F0ZVllYXIsXG4gIHNpZ25lZE9mZnNldCxcbiAgcGFyc2VJbnRlZ2VyLFxuICBwYXJzZU1pbGxpcyxcbiAgaWFuYVJlZ2V4LFxuICBpc1VuZGVmaW5lZCxcbn0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuaW1wb3J0ICogYXMgRW5nbGlzaCBmcm9tIFwiLi9lbmdsaXNoLmpzXCI7XG5pbXBvcnQgRml4ZWRPZmZzZXRab25lIGZyb20gXCIuLi96b25lcy9maXhlZE9mZnNldFpvbmUuanNcIjtcbmltcG9ydCBJQU5BWm9uZSBmcm9tIFwiLi4vem9uZXMvSUFOQVpvbmUuanNcIjtcblxuLypcbiAqIFRoaXMgZmlsZSBoYW5kbGVzIHBhcnNpbmcgZm9yIHdlbGwtc3BlY2lmaWVkIGZvcm1hdHMuIEhlcmUncyBob3cgaXQgd29ya3M6XG4gKiBUd28gdGhpbmdzIGdvIGludG8gcGFyc2luZzogYSByZWdleCB0byBtYXRjaCB3aXRoIGFuZCBhbiBleHRyYWN0b3IgdG8gdGFrZSBhcGFydCB0aGUgZ3JvdXBzIGluIHRoZSBtYXRjaC5cbiAqIEFuIGV4dHJhY3RvciBpcyBqdXN0IGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHJlZ2V4IG1hdGNoIGFycmF5IGFuZCByZXR1cm5zIGEgeyB5ZWFyOiAuLi4sIG1vbnRoOiAuLi4gfSBvYmplY3RcbiAqIHBhcnNlKCkgZG9lcyB0aGUgd29yayBvZiBleGVjdXRpbmcgdGhlIHJlZ2V4IGFuZCBhcHBseWluZyB0aGUgZXh0cmFjdG9yLiBJdCB0YWtlcyBtdWx0aXBsZSByZWdleC9leHRyYWN0b3IgcGFpcnMgdG8gdHJ5IGluIHNlcXVlbmNlLlxuICogRXh0cmFjdG9ycyBjYW4gdGFrZSBhIFwiY3Vyc29yXCIgcmVwcmVzZW50aW5nIHRoZSBvZmZzZXQgaW4gdGhlIG1hdGNoIHRvIGxvb2sgYXQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byBjb21iaW5lIGV4dHJhY3RvcnMuXG4gKiBjb21iaW5lRXh0cmFjdG9ycygpIGRvZXMgdGhlIHdvcmsgb2YgY29tYmluaW5nIHRoZW0sIGtlZXBpbmcgdHJhY2sgb2YgdGhlIGN1cnNvciB0aHJvdWdoIG11bHRpcGxlIGV4dHJhY3Rpb25zLlxuICogU29tZSBleHRyYWN0aW9ucyBhcmUgc3VwZXIgZHVtYiBhbmQgc2ltcGxlUGFyc2UgYW5kIGZyb21TdHJpbmdzIGhlbHAgRFJZIHRoZW0uXG4gKi9cblxuZnVuY3Rpb24gY29tYmluZVJlZ2V4ZXMoLi4ucmVnZXhlcykge1xuICBjb25zdCBmdWxsID0gcmVnZXhlcy5yZWR1Y2UoKGYsIHIpID0+IGYgKyByLnNvdXJjZSwgXCJcIik7XG4gIHJldHVybiBSZWdFeHAoYF4ke2Z1bGx9JGApO1xufVxuXG5mdW5jdGlvbiBjb21iaW5lRXh0cmFjdG9ycyguLi5leHRyYWN0b3JzKSB7XG4gIHJldHVybiAobSkgPT5cbiAgICBleHRyYWN0b3JzXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoW21lcmdlZFZhbHMsIG1lcmdlZFpvbmUsIGN1cnNvcl0sIGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgW3ZhbCwgem9uZSwgbmV4dF0gPSBleChtLCBjdXJzb3IpO1xuICAgICAgICAgIHJldHVybiBbeyAuLi5tZXJnZWRWYWxzLCAuLi52YWwgfSwgbWVyZ2VkWm9uZSB8fCB6b25lLCBuZXh0XTtcbiAgICAgICAgfSxcbiAgICAgICAgW3t9LCBudWxsLCAxXVxuICAgICAgKVxuICAgICAgLnNsaWNlKDAsIDIpO1xufVxuXG5mdW5jdGlvbiBwYXJzZShzLCAuLi5wYXR0ZXJucykge1xuICBpZiAocyA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFtudWxsLCBudWxsXTtcbiAgfVxuXG4gIGZvciAoY29uc3QgW3JlZ2V4LCBleHRyYWN0b3JdIG9mIHBhdHRlcm5zKSB7XG4gICAgY29uc3QgbSA9IHJlZ2V4LmV4ZWMocyk7XG4gICAgaWYgKG0pIHtcbiAgICAgIHJldHVybiBleHRyYWN0b3IobSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbbnVsbCwgbnVsbF07XG59XG5cbmZ1bmN0aW9uIHNpbXBsZVBhcnNlKC4uLmtleXMpIHtcbiAgcmV0dXJuIChtYXRjaCwgY3Vyc29yKSA9PiB7XG4gICAgY29uc3QgcmV0ID0ge307XG4gICAgbGV0IGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgcmV0W2tleXNbaV1dID0gcGFyc2VJbnRlZ2VyKG1hdGNoW2N1cnNvciArIGldKTtcbiAgICB9XG4gICAgcmV0dXJuIFtyZXQsIG51bGwsIGN1cnNvciArIGldO1xuICB9O1xufVxuXG4vLyBJU08gYW5kIFNRTCBwYXJzaW5nXG5jb25zdCBvZmZzZXRSZWdleCA9IC8oPzooWil8KFsrLV1cXGRcXGQpKD86Oj8oXFxkXFxkKSk/KS8sXG4gIGlzb1RpbWVCYXNlUmVnZXggPSAvKFxcZFxcZCkoPzo6PyhcXGRcXGQpKD86Oj8oXFxkXFxkKSg/OlsuLF0oXFxkezEsMzB9KSk/KT8pPy8sXG4gIGlzb1RpbWVSZWdleCA9IFJlZ0V4cChgJHtpc29UaW1lQmFzZVJlZ2V4LnNvdXJjZX0ke29mZnNldFJlZ2V4LnNvdXJjZX0/YCksXG4gIGlzb1RpbWVFeHRlbnNpb25SZWdleCA9IFJlZ0V4cChgKD86VCR7aXNvVGltZVJlZ2V4LnNvdXJjZX0pP2ApLFxuICBpc29ZbWRSZWdleCA9IC8oWystXVxcZHs2fXxcXGR7NH0pKD86LT8oXFxkXFxkKSg/Oi0/KFxcZFxcZCkpPyk/LyxcbiAgaXNvV2Vla1JlZ2V4ID0gLyhcXGR7NH0pLT9XKFxcZFxcZCkoPzotPyhcXGQpKT8vLFxuICBpc29PcmRpbmFsUmVnZXggPSAvKFxcZHs0fSktPyhcXGR7M30pLyxcbiAgZXh0cmFjdElTT1dlZWtEYXRhID0gc2ltcGxlUGFyc2UoXCJ3ZWVrWWVhclwiLCBcIndlZWtOdW1iZXJcIiwgXCJ3ZWVrRGF5XCIpLFxuICBleHRyYWN0SVNPT3JkaW5hbERhdGEgPSBzaW1wbGVQYXJzZShcInllYXJcIiwgXCJvcmRpbmFsXCIpLFxuICBzcWxZbWRSZWdleCA9IC8oXFxkezR9KS0oXFxkXFxkKS0oXFxkXFxkKS8sIC8vIGR1bWJlZC1kb3duIHZlcnNpb24gb2YgdGhlIElTTyBvbmVcbiAgc3FsVGltZVJlZ2V4ID0gUmVnRXhwKFxuICAgIGAke2lzb1RpbWVCYXNlUmVnZXguc291cmNlfSA/KD86JHtvZmZzZXRSZWdleC5zb3VyY2V9fCgke2lhbmFSZWdleC5zb3VyY2V9KSk/YFxuICApLFxuICBzcWxUaW1lRXh0ZW5zaW9uUmVnZXggPSBSZWdFeHAoYCg/OiAke3NxbFRpbWVSZWdleC5zb3VyY2V9KT9gKTtcblxuZnVuY3Rpb24gaW50KG1hdGNoLCBwb3MsIGZhbGxiYWNrKSB7XG4gIGNvbnN0IG0gPSBtYXRjaFtwb3NdO1xuICByZXR1cm4gaXNVbmRlZmluZWQobSkgPyBmYWxsYmFjayA6IHBhcnNlSW50ZWdlcihtKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElTT1ltZChtYXRjaCwgY3Vyc29yKSB7XG4gIGNvbnN0IGl0ZW0gPSB7XG4gICAgeWVhcjogaW50KG1hdGNoLCBjdXJzb3IpLFxuICAgIG1vbnRoOiBpbnQobWF0Y2gsIGN1cnNvciArIDEsIDEpLFxuICAgIGRheTogaW50KG1hdGNoLCBjdXJzb3IgKyAyLCAxKSxcbiAgfTtcblxuICByZXR1cm4gW2l0ZW0sIG51bGwsIGN1cnNvciArIDNdO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0SVNPVGltZShtYXRjaCwgY3Vyc29yKSB7XG4gIGNvbnN0IGl0ZW0gPSB7XG4gICAgaG91cnM6IGludChtYXRjaCwgY3Vyc29yLCAwKSxcbiAgICBtaW51dGVzOiBpbnQobWF0Y2gsIGN1cnNvciArIDEsIDApLFxuICAgIHNlY29uZHM6IGludChtYXRjaCwgY3Vyc29yICsgMiwgMCksXG4gICAgbWlsbGlzZWNvbmRzOiBwYXJzZU1pbGxpcyhtYXRjaFtjdXJzb3IgKyAzXSksXG4gIH07XG5cbiAgcmV0dXJuIFtpdGVtLCBudWxsLCBjdXJzb3IgKyA0XTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElTT09mZnNldChtYXRjaCwgY3Vyc29yKSB7XG4gIGNvbnN0IGxvY2FsID0gIW1hdGNoW2N1cnNvcl0gJiYgIW1hdGNoW2N1cnNvciArIDFdLFxuICAgIGZ1bGxPZmZzZXQgPSBzaWduZWRPZmZzZXQobWF0Y2hbY3Vyc29yICsgMV0sIG1hdGNoW2N1cnNvciArIDJdKSxcbiAgICB6b25lID0gbG9jYWwgPyBudWxsIDogRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKGZ1bGxPZmZzZXQpO1xuICByZXR1cm4gW3t9LCB6b25lLCBjdXJzb3IgKyAzXTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElBTkFab25lKG1hdGNoLCBjdXJzb3IpIHtcbiAgY29uc3Qgem9uZSA9IG1hdGNoW2N1cnNvcl0gPyBJQU5BWm9uZS5jcmVhdGUobWF0Y2hbY3Vyc29yXSkgOiBudWxsO1xuICByZXR1cm4gW3t9LCB6b25lLCBjdXJzb3IgKyAxXTtcbn1cblxuLy8gSVNPIHRpbWUgcGFyc2luZ1xuXG5jb25zdCBpc29UaW1lT25seSA9IFJlZ0V4cChgXlQ/JHtpc29UaW1lQmFzZVJlZ2V4LnNvdXJjZX0kYCk7XG5cbi8vIElTTyBkdXJhdGlvbiBwYXJzaW5nXG5cbmNvbnN0IGlzb0R1cmF0aW9uID1cbiAgL14tP1AoPzooPzooLT9cXGR7MSw5fSlZKT8oPzooLT9cXGR7MSw5fSlNKT8oPzooLT9cXGR7MSw5fSlXKT8oPzooLT9cXGR7MSw5fSlEKT8oPzpUKD86KC0/XFxkezEsOX0pSCk/KD86KC0/XFxkezEsOX0pTSk/KD86KC0/XFxkezEsMjB9KSg/OlsuLF0oLT9cXGR7MSw5fSkpP1MpPyk/KSQvO1xuXG5mdW5jdGlvbiBleHRyYWN0SVNPRHVyYXRpb24obWF0Y2gpIHtcbiAgY29uc3QgW3MsIHllYXJTdHIsIG1vbnRoU3RyLCB3ZWVrU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyLCBtaWxsaXNlY29uZHNTdHJdID1cbiAgICBtYXRjaDtcblxuICBjb25zdCBoYXNOZWdhdGl2ZVByZWZpeCA9IHNbMF0gPT09IFwiLVwiO1xuICBjb25zdCBuZWdhdGl2ZVNlY29uZHMgPSBzZWNvbmRTdHIgJiYgc2Vjb25kU3RyWzBdID09PSBcIi1cIjtcblxuICBjb25zdCBtYXliZU5lZ2F0ZSA9IChudW0sIGZvcmNlID0gZmFsc2UpID0+XG4gICAgbnVtICE9PSB1bmRlZmluZWQgJiYgKGZvcmNlIHx8IChudW0gJiYgaGFzTmVnYXRpdmVQcmVmaXgpKSA/IC1udW0gOiBudW07XG5cbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICB5ZWFyczogbWF5YmVOZWdhdGUocGFyc2VJbnRlZ2VyKHllYXJTdHIpKSxcbiAgICAgIG1vbnRoczogbWF5YmVOZWdhdGUocGFyc2VJbnRlZ2VyKG1vbnRoU3RyKSksXG4gICAgICB3ZWVrczogbWF5YmVOZWdhdGUocGFyc2VJbnRlZ2VyKHdlZWtTdHIpKSxcbiAgICAgIGRheXM6IG1heWJlTmVnYXRlKHBhcnNlSW50ZWdlcihkYXlTdHIpKSxcbiAgICAgIGhvdXJzOiBtYXliZU5lZ2F0ZShwYXJzZUludGVnZXIoaG91clN0cikpLFxuICAgICAgbWludXRlczogbWF5YmVOZWdhdGUocGFyc2VJbnRlZ2VyKG1pbnV0ZVN0cikpLFxuICAgICAgc2Vjb25kczogbWF5YmVOZWdhdGUocGFyc2VJbnRlZ2VyKHNlY29uZFN0ciksIHNlY29uZFN0ciA9PT0gXCItMFwiKSxcbiAgICAgIG1pbGxpc2Vjb25kczogbWF5YmVOZWdhdGUocGFyc2VNaWxsaXMobWlsbGlzZWNvbmRzU3RyKSwgbmVnYXRpdmVTZWNvbmRzKSxcbiAgICB9LFxuICBdO1xufVxuXG4vLyBUaGVzZSBhcmUgYSBsaXR0bGUgYnJhaW5kZWFkLiBFRFQgKnNob3VsZCogdGVsbCB1cyB0aGF0IHdlJ3JlIGluLCBzYXksIEFtZXJpY2EvTmV3X1lvcmtcbi8vIGFuZCBub3QganVzdCB0aGF0IHdlJ3JlIGluIC0yNDAgKnJpZ2h0IG5vdyouIEJ1dCBzaW5jZSBJIGRvbid0IHRoaW5rIHRoZXNlIGFyZSB1c2VkIHRoYXQgb2Z0ZW5cbi8vIEknbSBqdXN0IGdvaW5nIHRvIGlnbm9yZSB0aGF0XG5jb25zdCBvYnNPZmZzZXRzID0ge1xuICBHTVQ6IDAsXG4gIEVEVDogLTQgKiA2MCxcbiAgRVNUOiAtNSAqIDYwLFxuICBDRFQ6IC01ICogNjAsXG4gIENTVDogLTYgKiA2MCxcbiAgTURUOiAtNiAqIDYwLFxuICBNU1Q6IC03ICogNjAsXG4gIFBEVDogLTcgKiA2MCxcbiAgUFNUOiAtOCAqIDYwLFxufTtcblxuZnVuY3Rpb24gZnJvbVN0cmluZ3Mod2Vla2RheVN0ciwgeWVhclN0ciwgbW9udGhTdHIsIGRheVN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIpIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIHllYXI6IHllYXJTdHIubGVuZ3RoID09PSAyID8gdW50cnVuY2F0ZVllYXIocGFyc2VJbnRlZ2VyKHllYXJTdHIpKSA6IHBhcnNlSW50ZWdlcih5ZWFyU3RyKSxcbiAgICBtb250aDogRW5nbGlzaC5tb250aHNTaG9ydC5pbmRleE9mKG1vbnRoU3RyKSArIDEsXG4gICAgZGF5OiBwYXJzZUludGVnZXIoZGF5U3RyKSxcbiAgICBob3VyOiBwYXJzZUludGVnZXIoaG91clN0ciksXG4gICAgbWludXRlOiBwYXJzZUludGVnZXIobWludXRlU3RyKSxcbiAgfTtcblxuICBpZiAoc2Vjb25kU3RyKSByZXN1bHQuc2Vjb25kID0gcGFyc2VJbnRlZ2VyKHNlY29uZFN0cik7XG4gIGlmICh3ZWVrZGF5U3RyKSB7XG4gICAgcmVzdWx0LndlZWtkYXkgPVxuICAgICAgd2Vla2RheVN0ci5sZW5ndGggPiAzXG4gICAgICAgID8gRW5nbGlzaC53ZWVrZGF5c0xvbmcuaW5kZXhPZih3ZWVrZGF5U3RyKSArIDFcbiAgICAgICAgOiBFbmdsaXNoLndlZWtkYXlzU2hvcnQuaW5kZXhPZih3ZWVrZGF5U3RyKSArIDE7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyBSRkMgMjgyMi81MzIyXG5jb25zdCByZmMyODIyID1cbiAgL14oPzooTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSxcXHMpPyhcXGR7MSwyfSlcXHMoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpXFxzKFxcZHsyLDR9KVxccyhcXGRcXGQpOihcXGRcXGQpKD86OihcXGRcXGQpKT9cXHMoPzooVVR8R01UfFtFQ01QXVtTRF1UKXwoW1p6XSl8KD86KFsrLV1cXGRcXGQpKFxcZFxcZCkpKSQvO1xuXG5mdW5jdGlvbiBleHRyYWN0UkZDMjgyMihtYXRjaCkge1xuICBjb25zdCBbXG4gICAgICAsXG4gICAgICB3ZWVrZGF5U3RyLFxuICAgICAgZGF5U3RyLFxuICAgICAgbW9udGhTdHIsXG4gICAgICB5ZWFyU3RyLFxuICAgICAgaG91clN0cixcbiAgICAgIG1pbnV0ZVN0cixcbiAgICAgIHNlY29uZFN0cixcbiAgICAgIG9ic09mZnNldCxcbiAgICAgIG1pbE9mZnNldCxcbiAgICAgIG9mZkhvdXJTdHIsXG4gICAgICBvZmZNaW51dGVTdHIsXG4gICAgXSA9IG1hdGNoLFxuICAgIHJlc3VsdCA9IGZyb21TdHJpbmdzKHdlZWtkYXlTdHIsIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyKTtcblxuICBsZXQgb2Zmc2V0O1xuICBpZiAob2JzT2Zmc2V0KSB7XG4gICAgb2Zmc2V0ID0gb2JzT2Zmc2V0c1tvYnNPZmZzZXRdO1xuICB9IGVsc2UgaWYgKG1pbE9mZnNldCkge1xuICAgIG9mZnNldCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgb2Zmc2V0ID0gc2lnbmVkT2Zmc2V0KG9mZkhvdXJTdHIsIG9mZk1pbnV0ZVN0cik7XG4gIH1cblxuICByZXR1cm4gW3Jlc3VsdCwgbmV3IEZpeGVkT2Zmc2V0Wm9uZShvZmZzZXQpXTtcbn1cblxuZnVuY3Rpb24gcHJlcHJvY2Vzc1JGQzI4MjIocykge1xuICAvLyBSZW1vdmUgY29tbWVudHMgYW5kIGZvbGRpbmcgd2hpdGVzcGFjZSBhbmQgcmVwbGFjZSBtdWx0aXBsZS1zcGFjZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuICByZXR1cm4gc1xuICAgIC5yZXBsYWNlKC9cXChbXildKlxcKXxbXFxuXFx0XS9nLCBcIiBcIilcbiAgICAucmVwbGFjZSgvKFxcc1xccyspL2csIFwiIFwiKVxuICAgIC50cmltKCk7XG59XG5cbi8vIGh0dHAgZGF0ZVxuXG5jb25zdCByZmMxMTIzID1cbiAgICAvXihNb258VHVlfFdlZHxUaHV8RnJpfFNhdHxTdW4pLCAoXFxkXFxkKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpIChcXGR7NH0pIChcXGRcXGQpOihcXGRcXGQpOihcXGRcXGQpIEdNVCQvLFxuICByZmM4NTAgPVxuICAgIC9eKE1vbmRheXxUdWVzZGF5fFdlZHNkYXl8VGh1cnNkYXl8RnJpZGF5fFNhdHVyZGF5fFN1bmRheSksIChcXGRcXGQpLShKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYyktKFxcZFxcZCkgKFxcZFxcZCk6KFxcZFxcZCk6KFxcZFxcZCkgR01UJC8sXG4gIGFzY2lpID1cbiAgICAvXihNb258VHVlfFdlZHxUaHV8RnJpfFNhdHxTdW4pIChKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYykgKCBcXGR8XFxkXFxkKSAoXFxkXFxkKTooXFxkXFxkKTooXFxkXFxkKSAoXFxkezR9KSQvO1xuXG5mdW5jdGlvbiBleHRyYWN0UkZDMTEyM09yODUwKG1hdGNoKSB7XG4gIGNvbnN0IFssIHdlZWtkYXlTdHIsIGRheVN0ciwgbW9udGhTdHIsIHllYXJTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyXSA9IG1hdGNoLFxuICAgIHJlc3VsdCA9IGZyb21TdHJpbmdzKHdlZWtkYXlTdHIsIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyKTtcbiAgcmV0dXJuIFtyZXN1bHQsIEZpeGVkT2Zmc2V0Wm9uZS51dGNJbnN0YW5jZV07XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RBU0NJSShtYXRjaCkge1xuICBjb25zdCBbLCB3ZWVrZGF5U3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0ciwgeWVhclN0cl0gPSBtYXRjaCxcbiAgICByZXN1bHQgPSBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cik7XG4gIHJldHVybiBbcmVzdWx0LCBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2VdO1xufVxuXG5jb25zdCBpc29ZbWRXaXRoVGltZUV4dGVuc2lvblJlZ2V4ID0gY29tYmluZVJlZ2V4ZXMoaXNvWW1kUmVnZXgsIGlzb1RpbWVFeHRlbnNpb25SZWdleCk7XG5jb25zdCBpc29XZWVrV2l0aFRpbWVFeHRlbnNpb25SZWdleCA9IGNvbWJpbmVSZWdleGVzKGlzb1dlZWtSZWdleCwgaXNvVGltZUV4dGVuc2lvblJlZ2V4KTtcbmNvbnN0IGlzb09yZGluYWxXaXRoVGltZUV4dGVuc2lvblJlZ2V4ID0gY29tYmluZVJlZ2V4ZXMoaXNvT3JkaW5hbFJlZ2V4LCBpc29UaW1lRXh0ZW5zaW9uUmVnZXgpO1xuY29uc3QgaXNvVGltZUNvbWJpbmVkUmVnZXggPSBjb21iaW5lUmVnZXhlcyhpc29UaW1lUmVnZXgpO1xuXG5jb25zdCBleHRyYWN0SVNPWW1kVGltZUFuZE9mZnNldCA9IGNvbWJpbmVFeHRyYWN0b3JzKFxuICBleHRyYWN0SVNPWW1kLFxuICBleHRyYWN0SVNPVGltZSxcbiAgZXh0cmFjdElTT09mZnNldFxuKTtcbmNvbnN0IGV4dHJhY3RJU09XZWVrVGltZUFuZE9mZnNldCA9IGNvbWJpbmVFeHRyYWN0b3JzKFxuICBleHRyYWN0SVNPV2Vla0RhdGEsXG4gIGV4dHJhY3RJU09UaW1lLFxuICBleHRyYWN0SVNPT2Zmc2V0XG4pO1xuY29uc3QgZXh0cmFjdElTT09yZGluYWxEYXRlQW5kVGltZSA9IGNvbWJpbmVFeHRyYWN0b3JzKFxuICBleHRyYWN0SVNPT3JkaW5hbERhdGEsXG4gIGV4dHJhY3RJU09UaW1lLFxuICBleHRyYWN0SVNPT2Zmc2V0XG4pO1xuY29uc3QgZXh0cmFjdElTT1RpbWVBbmRPZmZzZXQgPSBjb21iaW5lRXh0cmFjdG9ycyhleHRyYWN0SVNPVGltZSwgZXh0cmFjdElTT09mZnNldCk7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJU09EYXRlKHMpIHtcbiAgcmV0dXJuIHBhcnNlKFxuICAgIHMsXG4gICAgW2lzb1ltZFdpdGhUaW1lRXh0ZW5zaW9uUmVnZXgsIGV4dHJhY3RJU09ZbWRUaW1lQW5kT2Zmc2V0XSxcbiAgICBbaXNvV2Vla1dpdGhUaW1lRXh0ZW5zaW9uUmVnZXgsIGV4dHJhY3RJU09XZWVrVGltZUFuZE9mZnNldF0sXG4gICAgW2lzb09yZGluYWxXaXRoVGltZUV4dGVuc2lvblJlZ2V4LCBleHRyYWN0SVNPT3JkaW5hbERhdGVBbmRUaW1lXSxcbiAgICBbaXNvVGltZUNvbWJpbmVkUmVnZXgsIGV4dHJhY3RJU09UaW1lQW5kT2Zmc2V0XVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSRkMyODIyRGF0ZShzKSB7XG4gIHJldHVybiBwYXJzZShwcmVwcm9jZXNzUkZDMjgyMihzKSwgW3JmYzI4MjIsIGV4dHJhY3RSRkMyODIyXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUhUVFBEYXRlKHMpIHtcbiAgcmV0dXJuIHBhcnNlKFxuICAgIHMsXG4gICAgW3JmYzExMjMsIGV4dHJhY3RSRkMxMTIzT3I4NTBdLFxuICAgIFtyZmM4NTAsIGV4dHJhY3RSRkMxMTIzT3I4NTBdLFxuICAgIFthc2NpaSwgZXh0cmFjdEFTQ0lJXVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJU09EdXJhdGlvbihzKSB7XG4gIHJldHVybiBwYXJzZShzLCBbaXNvRHVyYXRpb24sIGV4dHJhY3RJU09EdXJhdGlvbl0pO1xufVxuXG5jb25zdCBleHRyYWN0SVNPVGltZU9ubHkgPSBjb21iaW5lRXh0cmFjdG9ycyhleHRyYWN0SVNPVGltZSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUlTT1RpbWVPbmx5KHMpIHtcbiAgcmV0dXJuIHBhcnNlKHMsIFtpc29UaW1lT25seSwgZXh0cmFjdElTT1RpbWVPbmx5XSk7XG59XG5cbmNvbnN0IHNxbFltZFdpdGhUaW1lRXh0ZW5zaW9uUmVnZXggPSBjb21iaW5lUmVnZXhlcyhzcWxZbWRSZWdleCwgc3FsVGltZUV4dGVuc2lvblJlZ2V4KTtcbmNvbnN0IHNxbFRpbWVDb21iaW5lZFJlZ2V4ID0gY29tYmluZVJlZ2V4ZXMoc3FsVGltZVJlZ2V4KTtcblxuY29uc3QgZXh0cmFjdElTT1ltZFRpbWVPZmZzZXRBbmRJQU5BWm9uZSA9IGNvbWJpbmVFeHRyYWN0b3JzKFxuICBleHRyYWN0SVNPWW1kLFxuICBleHRyYWN0SVNPVGltZSxcbiAgZXh0cmFjdElTT09mZnNldCxcbiAgZXh0cmFjdElBTkFab25lXG4pO1xuY29uc3QgZXh0cmFjdElTT1RpbWVPZmZzZXRBbmRJQU5BWm9uZSA9IGNvbWJpbmVFeHRyYWN0b3JzKFxuICBleHRyYWN0SVNPVGltZSxcbiAgZXh0cmFjdElTT09mZnNldCxcbiAgZXh0cmFjdElBTkFab25lXG4pO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTUUwocykge1xuICByZXR1cm4gcGFyc2UoXG4gICAgcyxcbiAgICBbc3FsWW1kV2l0aFRpbWVFeHRlbnNpb25SZWdleCwgZXh0cmFjdElTT1ltZFRpbWVPZmZzZXRBbmRJQU5BWm9uZV0sXG4gICAgW3NxbFRpbWVDb21iaW5lZFJlZ2V4LCBleHRyYWN0SVNPVGltZU9mZnNldEFuZElBTkFab25lXVxuICApO1xufVxuIiwgImltcG9ydCB7IEludmFsaWRBcmd1bWVudEVycm9yLCBJbnZhbGlkRHVyYXRpb25FcnJvciwgSW52YWxpZFVuaXRFcnJvciB9IGZyb20gXCIuL2Vycm9ycy5qc1wiO1xuaW1wb3J0IEZvcm1hdHRlciBmcm9tIFwiLi9pbXBsL2Zvcm1hdHRlci5qc1wiO1xuaW1wb3J0IEludmFsaWQgZnJvbSBcIi4vaW1wbC9pbnZhbGlkLmpzXCI7XG5pbXBvcnQgTG9jYWxlIGZyb20gXCIuL2ltcGwvbG9jYWxlLmpzXCI7XG5pbXBvcnQgeyBwYXJzZUlTT0R1cmF0aW9uLCBwYXJzZUlTT1RpbWVPbmx5IH0gZnJvbSBcIi4vaW1wbC9yZWdleFBhcnNlci5qc1wiO1xuaW1wb3J0IHtcbiAgYXNOdW1iZXIsXG4gIGhhc093blByb3BlcnR5LFxuICBpc051bWJlcixcbiAgaXNVbmRlZmluZWQsXG4gIG5vcm1hbGl6ZU9iamVjdCxcbiAgcm91bmRUbyxcbn0gZnJvbSBcIi4vaW1wbC91dGlsLmpzXCI7XG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4vc2V0dGluZ3MuanNcIjtcblxuY29uc3QgSU5WQUxJRCA9IFwiSW52YWxpZCBEdXJhdGlvblwiO1xuXG4vLyB1bml0IGNvbnZlcnNpb24gY29uc3RhbnRzXG5jb25zdCBsb3dPcmRlck1hdHJpeCA9IHtcbiAgICB3ZWVrczoge1xuICAgICAgZGF5czogNyxcbiAgICAgIGhvdXJzOiA3ICogMjQsXG4gICAgICBtaW51dGVzOiA3ICogMjQgKiA2MCxcbiAgICAgIHNlY29uZHM6IDcgKiAyNCAqIDYwICogNjAsXG4gICAgICBtaWxsaXNlY29uZHM6IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwLFxuICAgIH0sXG4gICAgZGF5czoge1xuICAgICAgaG91cnM6IDI0LFxuICAgICAgbWludXRlczogMjQgKiA2MCxcbiAgICAgIHNlY29uZHM6IDI0ICogNjAgKiA2MCxcbiAgICAgIG1pbGxpc2Vjb25kczogMjQgKiA2MCAqIDYwICogMTAwMCxcbiAgICB9LFxuICAgIGhvdXJzOiB7IG1pbnV0ZXM6IDYwLCBzZWNvbmRzOiA2MCAqIDYwLCBtaWxsaXNlY29uZHM6IDYwICogNjAgKiAxMDAwIH0sXG4gICAgbWludXRlczogeyBzZWNvbmRzOiA2MCwgbWlsbGlzZWNvbmRzOiA2MCAqIDEwMDAgfSxcbiAgICBzZWNvbmRzOiB7IG1pbGxpc2Vjb25kczogMTAwMCB9LFxuICB9LFxuICBjYXN1YWxNYXRyaXggPSB7XG4gICAgeWVhcnM6IHtcbiAgICAgIHF1YXJ0ZXJzOiA0LFxuICAgICAgbW9udGhzOiAxMixcbiAgICAgIHdlZWtzOiA1MixcbiAgICAgIGRheXM6IDM2NSxcbiAgICAgIGhvdXJzOiAzNjUgKiAyNCxcbiAgICAgIG1pbnV0ZXM6IDM2NSAqIDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiAzNjUgKiAyNCAqIDYwICogNjAsXG4gICAgICBtaWxsaXNlY29uZHM6IDM2NSAqIDI0ICogNjAgKiA2MCAqIDEwMDAsXG4gICAgfSxcbiAgICBxdWFydGVyczoge1xuICAgICAgbW9udGhzOiAzLFxuICAgICAgd2Vla3M6IDEzLFxuICAgICAgZGF5czogOTEsXG4gICAgICBob3VyczogOTEgKiAyNCxcbiAgICAgIG1pbnV0ZXM6IDkxICogMjQgKiA2MCxcbiAgICAgIHNlY29uZHM6IDkxICogMjQgKiA2MCAqIDYwLFxuICAgICAgbWlsbGlzZWNvbmRzOiA5MSAqIDI0ICogNjAgKiA2MCAqIDEwMDAsXG4gICAgfSxcbiAgICBtb250aHM6IHtcbiAgICAgIHdlZWtzOiA0LFxuICAgICAgZGF5czogMzAsXG4gICAgICBob3VyczogMzAgKiAyNCxcbiAgICAgIG1pbnV0ZXM6IDMwICogMjQgKiA2MCxcbiAgICAgIHNlY29uZHM6IDMwICogMjQgKiA2MCAqIDYwLFxuICAgICAgbWlsbGlzZWNvbmRzOiAzMCAqIDI0ICogNjAgKiA2MCAqIDEwMDAsXG4gICAgfSxcblxuICAgIC4uLmxvd09yZGVyTWF0cml4LFxuICB9LFxuICBkYXlzSW5ZZWFyQWNjdXJhdGUgPSAxNDYwOTcuMCAvIDQwMCxcbiAgZGF5c0luTW9udGhBY2N1cmF0ZSA9IDE0NjA5Ny4wIC8gNDgwMCxcbiAgYWNjdXJhdGVNYXRyaXggPSB7XG4gICAgeWVhcnM6IHtcbiAgICAgIHF1YXJ0ZXJzOiA0LFxuICAgICAgbW9udGhzOiAxMixcbiAgICAgIHdlZWtzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgLyA3LFxuICAgICAgZGF5czogZGF5c0luWWVhckFjY3VyYXRlLFxuICAgICAgaG91cnM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0LFxuICAgICAgbWludXRlczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCxcbiAgICAgIHNlY29uZHM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgKiA2MCxcbiAgICAgIG1pbGxpc2Vjb25kczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCAqIDYwICogMTAwMCxcbiAgICB9LFxuICAgIHF1YXJ0ZXJzOiB7XG4gICAgICBtb250aHM6IDMsXG4gICAgICB3ZWVrczogZGF5c0luWWVhckFjY3VyYXRlIC8gMjgsXG4gICAgICBkYXlzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgLyA0LFxuICAgICAgaG91cnM6IChkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCkgLyA0LFxuICAgICAgbWludXRlczogKGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjApIC8gNCxcbiAgICAgIHNlY29uZHM6IChkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwICogNjApIC8gNCxcbiAgICAgIG1pbGxpc2Vjb25kczogKGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgKiA2MCAqIDEwMDApIC8gNCxcbiAgICB9LFxuICAgIG1vbnRoczoge1xuICAgICAgd2Vla3M6IGRheXNJbk1vbnRoQWNjdXJhdGUgLyA3LFxuICAgICAgZGF5czogZGF5c0luTW9udGhBY2N1cmF0ZSxcbiAgICAgIGhvdXJzOiBkYXlzSW5Nb250aEFjY3VyYXRlICogMjQsXG4gICAgICBtaW51dGVzOiBkYXlzSW5Nb250aEFjY3VyYXRlICogMjQgKiA2MCxcbiAgICAgIHNlY29uZHM6IGRheXNJbk1vbnRoQWNjdXJhdGUgKiAyNCAqIDYwICogNjAsXG4gICAgICBtaWxsaXNlY29uZHM6IGRheXNJbk1vbnRoQWNjdXJhdGUgKiAyNCAqIDYwICogNjAgKiAxMDAwLFxuICAgIH0sXG4gICAgLi4ubG93T3JkZXJNYXRyaXgsXG4gIH07XG5cbi8vIHVuaXRzIG9yZGVyZWQgYnkgc2l6ZVxuY29uc3Qgb3JkZXJlZFVuaXRzID0gW1xuICBcInllYXJzXCIsXG4gIFwicXVhcnRlcnNcIixcbiAgXCJtb250aHNcIixcbiAgXCJ3ZWVrc1wiLFxuICBcImRheXNcIixcbiAgXCJob3Vyc1wiLFxuICBcIm1pbnV0ZXNcIixcbiAgXCJzZWNvbmRzXCIsXG4gIFwibWlsbGlzZWNvbmRzXCIsXG5dO1xuXG5jb25zdCByZXZlcnNlVW5pdHMgPSBvcmRlcmVkVW5pdHMuc2xpY2UoMCkucmV2ZXJzZSgpO1xuXG4vLyBjbG9uZSByZWFsbHkgbWVhbnMgXCJjcmVhdGUgYW5vdGhlciBpbnN0YW5jZSBqdXN0IGxpa2UgdGhpcyBvbmUsIGJ1dCB3aXRoIHRoZXNlIGNoYW5nZXNcIlxuZnVuY3Rpb24gY2xvbmUoZHVyLCBhbHRzLCBjbGVhciA9IGZhbHNlKSB7XG4gIC8vIGRlZXAgbWVyZ2UgZm9yIHZhbHNcbiAgY29uc3QgY29uZiA9IHtcbiAgICB2YWx1ZXM6IGNsZWFyID8gYWx0cy52YWx1ZXMgOiB7IC4uLmR1ci52YWx1ZXMsIC4uLihhbHRzLnZhbHVlcyB8fCB7fSkgfSxcbiAgICBsb2M6IGR1ci5sb2MuY2xvbmUoYWx0cy5sb2MpLFxuICAgIGNvbnZlcnNpb25BY2N1cmFjeTogYWx0cy5jb252ZXJzaW9uQWNjdXJhY3kgfHwgZHVyLmNvbnZlcnNpb25BY2N1cmFjeSxcbiAgfTtcbiAgcmV0dXJuIG5ldyBEdXJhdGlvbihjb25mKTtcbn1cblxuZnVuY3Rpb24gYW50aVRydW5jKG4pIHtcbiAgcmV0dXJuIG4gPCAwID8gTWF0aC5mbG9vcihuKSA6IE1hdGguY2VpbChuKTtcbn1cblxuLy8gTkI6IG11dGF0ZXMgcGFyYW1ldGVyc1xuZnVuY3Rpb24gY29udmVydChtYXRyaXgsIGZyb21NYXAsIGZyb21Vbml0LCB0b01hcCwgdG9Vbml0KSB7XG4gIGNvbnN0IGNvbnYgPSBtYXRyaXhbdG9Vbml0XVtmcm9tVW5pdF0sXG4gICAgcmF3ID0gZnJvbU1hcFtmcm9tVW5pdF0gLyBjb252LFxuICAgIHNhbWVTaWduID0gTWF0aC5zaWduKHJhdykgPT09IE1hdGguc2lnbih0b01hcFt0b1VuaXRdKSxcbiAgICAvLyBvaywgc28gdGhpcyBpcyB3aWxkLCBidXQgc2VlIHRoZSBtYXRyaXggaW4gdGhlIHRlc3RzXG4gICAgYWRkZWQgPVxuICAgICAgIXNhbWVTaWduICYmIHRvTWFwW3RvVW5pdF0gIT09IDAgJiYgTWF0aC5hYnMocmF3KSA8PSAxID8gYW50aVRydW5jKHJhdykgOiBNYXRoLnRydW5jKHJhdyk7XG4gIHRvTWFwW3RvVW5pdF0gKz0gYWRkZWQ7XG4gIGZyb21NYXBbZnJvbVVuaXRdIC09IGFkZGVkICogY29udjtcbn1cblxuLy8gTkI6IG11dGF0ZXMgcGFyYW1ldGVyc1xuZnVuY3Rpb24gbm9ybWFsaXplVmFsdWVzKG1hdHJpeCwgdmFscykge1xuICByZXZlcnNlVW5pdHMucmVkdWNlKChwcmV2aW91cywgY3VycmVudCkgPT4ge1xuICAgIGlmICghaXNVbmRlZmluZWQodmFsc1tjdXJyZW50XSkpIHtcbiAgICAgIGlmIChwcmV2aW91cykge1xuICAgICAgICBjb252ZXJ0KG1hdHJpeCwgdmFscywgcHJldmlvdXMsIHZhbHMsIGN1cnJlbnQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwcmV2aW91cztcbiAgICB9XG4gIH0sIG51bGwpO1xufVxuXG4vKipcbiAqIEEgRHVyYXRpb24gb2JqZWN0IHJlcHJlc2VudHMgYSBwZXJpb2Qgb2YgdGltZSwgbGlrZSBcIjIgbW9udGhzXCIgb3IgXCIxIGRheSwgMSBob3VyXCIuIENvbmNlcHR1YWxseSwgaXQncyBqdXN0IGEgbWFwIG9mIHVuaXRzIHRvIHRoZWlyIHF1YW50aXRpZXMsIGFjY29tcGFuaWVkIGJ5IHNvbWUgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGFuZCBtZXRob2RzIGZvciBjcmVhdGluZywgcGFyc2luZywgaW50ZXJyb2dhdGluZywgdHJhbnNmb3JtaW5nLCBhbmQgZm9ybWF0dGluZyB0aGVtLiBUaGV5IGNhbiBiZSB1c2VkIG9uIHRoZWlyIG93biBvciBpbiBjb25qdW5jdGlvbiB3aXRoIG90aGVyIEx1eG9uIHR5cGVzOyBmb3IgZXhhbXBsZSwgeW91IGNhbiB1c2Uge0BsaW5rIERhdGVUaW1lLnBsdXN9IHRvIGFkZCBhIER1cmF0aW9uIG9iamVjdCB0byBhIERhdGVUaW1lLCBwcm9kdWNpbmcgYW5vdGhlciBEYXRlVGltZS5cbiAqXG4gKiBIZXJlIGlzIGEgYnJpZWYgb3ZlcnZpZXcgb2YgY29tbW9ubHkgdXNlZCBtZXRob2RzIGFuZCBnZXR0ZXJzIGluIER1cmF0aW9uOlxuICpcbiAqICogKipDcmVhdGlvbioqIFRvIGNyZWF0ZSBhIER1cmF0aW9uLCB1c2Uge0BsaW5rIER1cmF0aW9uLmZyb21NaWxsaXN9LCB7QGxpbmsgRHVyYXRpb24uZnJvbU9iamVjdH0sIG9yIHtAbGluayBEdXJhdGlvbi5mcm9tSVNPfS5cbiAqICogKipVbml0IHZhbHVlcyoqIFNlZSB0aGUge0BsaW5rIER1cmF0aW9uI3llYXJzfSwge0BsaW5rIER1cmF0aW9uLm1vbnRoc30sIHtAbGluayBEdXJhdGlvbiN3ZWVrc30sIHtAbGluayBEdXJhdGlvbiNkYXlzfSwge0BsaW5rIER1cmF0aW9uI2hvdXJzfSwge0BsaW5rIER1cmF0aW9uI21pbnV0ZXN9LCB7QGxpbmsgRHVyYXRpb24jc2Vjb25kc30sIHtAbGluayBEdXJhdGlvbiNtaWxsaXNlY29uZHN9IGFjY2Vzc29ycy5cbiAqICogKipDb25maWd1cmF0aW9uKiogU2VlICB7QGxpbmsgRHVyYXRpb24jbG9jYWxlfSBhbmQge0BsaW5rIER1cmF0aW9uI251bWJlcmluZ1N5c3RlbX0gYWNjZXNzb3JzLlxuICogKiAqKlRyYW5zZm9ybWF0aW9uKiogVG8gY3JlYXRlIG5ldyBEdXJhdGlvbnMgb3V0IG9mIG9sZCBvbmVzIHVzZSB7QGxpbmsgRHVyYXRpb24jcGx1c30sIHtAbGluayBEdXJhdGlvbiNtaW51c30sIHtAbGluayBEdXJhdGlvbiNub3JtYWxpemV9LCB7QGxpbmsgRHVyYXRpb24jc2V0fSwge0BsaW5rIER1cmF0aW9uI3JlY29uZmlndXJlfSwge0BsaW5rIER1cmF0aW9uI3NoaWZ0VG99LCBhbmQge0BsaW5rIER1cmF0aW9uI25lZ2F0ZX0uXG4gKiAqICoqT3V0cHV0KiogVG8gY29udmVydCB0aGUgRHVyYXRpb24gaW50byBvdGhlciByZXByZXNlbnRhdGlvbnMsIHNlZSB7QGxpbmsgRHVyYXRpb24jYXN9LCB7QGxpbmsgRHVyYXRpb24jdG9JU099LCB7QGxpbmsgRHVyYXRpb24jdG9Gb3JtYXR9LCBhbmQge0BsaW5rIER1cmF0aW9uI3RvSlNPTn1cbiAqXG4gKiBUaGVyZSdzIGFyZSBtb3JlIG1ldGhvZHMgZG9jdW1lbnRlZCBiZWxvdy4gSW4gYWRkaXRpb24sIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHN1YnRsZXIgdG9waWNzIGxpa2UgaW50ZXJuYXRpb25hbGl6YXRpb24gYW5kIHZhbGlkaXR5LCBzZWUgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIER1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICBjb25zdCBhY2N1cmF0ZSA9IGNvbmZpZy5jb252ZXJzaW9uQWNjdXJhY3kgPT09IFwibG9uZ3Rlcm1cIiB8fCBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLnZhbHVlcyA9IGNvbmZpZy52YWx1ZXM7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5sb2MgPSBjb25maWcubG9jIHx8IExvY2FsZS5jcmVhdGUoKTtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmNvbnZlcnNpb25BY2N1cmFjeSA9IGFjY3VyYXRlID8gXCJsb25ndGVybVwiIDogXCJjYXN1YWxcIjtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmludmFsaWQgPSBjb25maWcuaW52YWxpZCB8fCBudWxsO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMubWF0cml4ID0gYWNjdXJhdGUgPyBhY2N1cmF0ZU1hdHJpeCA6IGNhc3VhbE1hdHJpeDtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmlzTHV4b25EdXJhdGlvbiA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIER1cmF0aW9uIGZyb20gYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gY291bnQgb2YgbWlsbGlzZWNvbmRzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyBmb3IgcGFyc2luZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdlbi1VUyddIC0gdGhlIGxvY2FsZSB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5jb252ZXJzaW9uQWNjdXJhY3k9J2Nhc3VhbCddIC0gdGhlIGNvbnZlcnNpb24gc3lzdGVtIHRvIHVzZVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHN0YXRpYyBmcm9tTWlsbGlzKGNvdW50LCBvcHRzKSB7XG4gICAgcmV0dXJuIER1cmF0aW9uLmZyb21PYmplY3QoeyBtaWxsaXNlY29uZHM6IGNvdW50IH0sIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIER1cmF0aW9uIGZyb20gYSBKYXZhU2NyaXB0IG9iamVjdCB3aXRoIGtleXMgbGlrZSAneWVhcnMnIGFuZCAnaG91cnMnLlxuICAgKiBJZiB0aGlzIG9iamVjdCBpcyBlbXB0eSB0aGVuIGEgemVybyBtaWxsaXNlY29uZHMgZHVyYXRpb24gaXMgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSB0aGUgb2JqZWN0IHRvIGNyZWF0ZSB0aGUgRGF0ZVRpbWUgZnJvbVxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnllYXJzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoucXVhcnRlcnNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5tb250aHNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrc1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLmRheXNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5ob3Vyc1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1pbnV0ZXNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5zZWNvbmRzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubWlsbGlzZWNvbmRzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0cz1bXV0gLSBvcHRpb25zIGZvciBjcmVhdGluZyB0aGlzIER1cmF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSB0aGUgbG9jYWxlIHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgc3RhdGljIGZyb21PYmplY3Qob2JqLCBvcHRzID0ge30pIHtcbiAgICBpZiAob2JqID09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgICBgRHVyYXRpb24uZnJvbU9iamVjdDogYXJndW1lbnQgZXhwZWN0ZWQgdG8gYmUgYW4gb2JqZWN0LCBnb3QgJHtcbiAgICAgICAgICBvYmogPT09IG51bGwgPyBcIm51bGxcIiA6IHR5cGVvZiBvYmpcbiAgICAgICAgfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRHVyYXRpb24oe1xuICAgICAgdmFsdWVzOiBub3JtYWxpemVPYmplY3Qob2JqLCBEdXJhdGlvbi5ub3JtYWxpemVVbml0KSxcbiAgICAgIGxvYzogTG9jYWxlLmZyb21PYmplY3Qob3B0cyksXG4gICAgICBjb252ZXJzaW9uQWNjdXJhY3k6IG9wdHMuY29udmVyc2lvbkFjY3VyYWN5LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIER1cmF0aW9uIGZyb20gYW4gSVNPIDg2MDEgZHVyYXRpb24gc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRleHQgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIGZvciBwYXJzaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSB0aGUgbG9jYWxlIHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjRHVyYXRpb25zXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21JU08oJ1AzWTZNMVc0RFQxMkgzME01UycpLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAzLCBtb250aHM6IDYsIHdlZWtzOiAxLCBkYXlzOiA0LCBob3VyczogMTIsIG1pbnV0ZXM6IDMwLCBzZWNvbmRzOiA1IH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTTygnUFQyM0gnKS50b09iamVjdCgpIC8vPT4geyBob3VyczogMjMgfVxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPKCdQNVkzTScpLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiA1LCBtb250aHM6IDMgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHN0YXRpYyBmcm9tSVNPKHRleHQsIG9wdHMpIHtcbiAgICBjb25zdCBbcGFyc2VkXSA9IHBhcnNlSVNPRHVyYXRpb24odGV4dCk7XG4gICAgaWYgKHBhcnNlZCkge1xuICAgICAgcmV0dXJuIER1cmF0aW9uLmZyb21PYmplY3QocGFyc2VkLCBvcHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIER1cmF0aW9uLmludmFsaWQoXCJ1bnBhcnNhYmxlXCIsIGB0aGUgaW5wdXQgXCIke3RleHR9XCIgY2FuJ3QgYmUgcGFyc2VkIGFzIElTTyA4NjAxYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIER1cmF0aW9uIGZyb20gYW4gSVNPIDg2MDEgdGltZSBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGV4dCB0byBwYXJzZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgZm9yIHBhcnNpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIHRoZSBsb2NhbGUgdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNUaW1lc1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPVGltZSgnMTE6MjI6MzMuNDQ0JykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAyMiwgc2Vjb25kczogMzMsIG1pbGxpc2Vjb25kczogNDQ0IH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTT1RpbWUoJzExOjAwJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAwLCBzZWNvbmRzOiAwIH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTT1RpbWUoJ1QxMTowMCcpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAxMSwgbWludXRlczogMCwgc2Vjb25kczogMCB9XG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21JU09UaW1lKCcxMTAwJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAwLCBzZWNvbmRzOiAwIH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTT1RpbWUoJ1QxMTAwJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAwLCBzZWNvbmRzOiAwIH1cbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBzdGF0aWMgZnJvbUlTT1RpbWUodGV4dCwgb3B0cykge1xuICAgIGNvbnN0IFtwYXJzZWRdID0gcGFyc2VJU09UaW1lT25seSh0ZXh0KTtcbiAgICBpZiAocGFyc2VkKSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uZnJvbU9iamVjdChwYXJzZWQsIG9wdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZChcInVucGFyc2FibGVcIiwgYHRoZSBpbnB1dCBcIiR7dGV4dH1cIiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGludmFsaWQgRHVyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24gLSBzaW1wbGUgc3RyaW5nIG9mIHdoeSB0aGlzIGRhdGV0aW1lIGlzIGludmFsaWQuIFNob3VsZCBub3QgY29udGFpbiBwYXJhbWV0ZXJzIG9yIGFueXRoaW5nIGVsc2UgZGF0YS1kZXBlbmRlbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHBsYW5hdGlvbj1udWxsXSAtIGxvbmdlciBleHBsYW5hdGlvbiwgbWF5IGluY2x1ZGUgcGFyYW1ldGVycyBhbmQgb3RoZXIgdXNlZnVsIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHN0YXRpYyBpbnZhbGlkKHJlYXNvbiwgZXhwbGFuYXRpb24gPSBudWxsKSB7XG4gICAgaWYgKCFyZWFzb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRHVyYXRpb24gaXMgaW52YWxpZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnZhbGlkID0gcmVhc29uIGluc3RhbmNlb2YgSW52YWxpZCA/IHJlYXNvbiA6IG5ldyBJbnZhbGlkKHJlYXNvbiwgZXhwbGFuYXRpb24pO1xuXG4gICAgaWYgKFNldHRpbmdzLnRocm93T25JbnZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZER1cmF0aW9uRXJyb3IoaW52YWxpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgRHVyYXRpb24oeyBpbnZhbGlkIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc3RhdGljIG5vcm1hbGl6ZVVuaXQodW5pdCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB7XG4gICAgICB5ZWFyOiBcInllYXJzXCIsXG4gICAgICB5ZWFyczogXCJ5ZWFyc1wiLFxuICAgICAgcXVhcnRlcjogXCJxdWFydGVyc1wiLFxuICAgICAgcXVhcnRlcnM6IFwicXVhcnRlcnNcIixcbiAgICAgIG1vbnRoOiBcIm1vbnRoc1wiLFxuICAgICAgbW9udGhzOiBcIm1vbnRoc1wiLFxuICAgICAgd2VlazogXCJ3ZWVrc1wiLFxuICAgICAgd2Vla3M6IFwid2Vla3NcIixcbiAgICAgIGRheTogXCJkYXlzXCIsXG4gICAgICBkYXlzOiBcImRheXNcIixcbiAgICAgIGhvdXI6IFwiaG91cnNcIixcbiAgICAgIGhvdXJzOiBcImhvdXJzXCIsXG4gICAgICBtaW51dGU6IFwibWludXRlc1wiLFxuICAgICAgbWludXRlczogXCJtaW51dGVzXCIsXG4gICAgICBzZWNvbmQ6IFwic2Vjb25kc1wiLFxuICAgICAgc2Vjb25kczogXCJzZWNvbmRzXCIsXG4gICAgICBtaWxsaXNlY29uZDogXCJtaWxsaXNlY29uZHNcIixcbiAgICAgIG1pbGxpc2Vjb25kczogXCJtaWxsaXNlY29uZHNcIixcbiAgICB9W3VuaXQgPyB1bml0LnRvTG93ZXJDYXNlKCkgOiB1bml0XTtcblxuICAgIGlmICghbm9ybWFsaXplZCkgdGhyb3cgbmV3IEludmFsaWRVbml0RXJyb3IodW5pdCk7XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBvYmplY3QgaXMgYSBEdXJhdGlvbi4gV29ya3MgYWNyb3NzIGNvbnRleHQgYm91bmRhcmllc1xuICAgKiBAcGFyYW0ge29iamVjdH0gb1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGlzRHVyYXRpb24obykge1xuICAgIHJldHVybiAobyAmJiBvLmlzTHV4b25EdXJhdGlvbikgfHwgZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0ICB0aGUgbG9jYWxlIG9mIGEgRHVyYXRpb24sIHN1Y2ggJ2VuLUdCJ1xuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxvY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubG9jYWxlIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlcmluZyBzeXN0ZW0gb2YgYSBEdXJhdGlvbiwgc3VjaCAnYmVuZycuIFRoZSBudW1iZXJpbmcgc3lzdGVtIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEdXJhdGlvblxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG51bWJlcmluZ1N5c3RlbSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24gZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGZvcm1hdCBzdHJpbmcuIFlvdSBtYXkgdXNlIHRoZXNlIHRva2VuczpcbiAgICogKiBgU2AgZm9yIG1pbGxpc2Vjb25kc1xuICAgKiAqIGBzYCBmb3Igc2Vjb25kc1xuICAgKiAqIGBtYCBmb3IgbWludXRlc1xuICAgKiAqIGBoYCBmb3IgaG91cnNcbiAgICogKiBgZGAgZm9yIGRheXNcbiAgICogKiBgTWAgZm9yIG1vbnRoc1xuICAgKiAqIGB5YCBmb3IgeWVhcnNcbiAgICogTm90ZXM6XG4gICAqICogQWRkIHBhZGRpbmcgYnkgcmVwZWF0aW5nIHRoZSB0b2tlbiwgZS5nLiBcInl5XCIgcGFkcyB0aGUgeWVhcnMgdG8gdHdvIGRpZ2l0cywgXCJoaGhoXCIgcGFkcyB0aGUgaG91cnMgb3V0IHRvIGZvdXIgZGlnaXRzXG4gICAqICogVGhlIGR1cmF0aW9uIHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBzZXQgb2YgdW5pdHMgaW4gdGhlIGZvcm1hdCBzdHJpbmcgdXNpbmcge0BsaW5rIER1cmF0aW9uLnNoaWZ0VG99IGFuZCB0aGUgRHVyYXRpb25zJ3MgY29udmVyc2lvbiBhY2N1cmFjeSBzZXR0aW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm10IC0gdGhlIGZvcm1hdCBzdHJpbmdcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZmxvb3I9dHJ1ZV0gLSBmbG9vciBudW1lcmljYWwgdmFsdWVzXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyB5ZWFyczogMSwgZGF5czogNiwgc2Vjb25kczogMiB9KS50b0Zvcm1hdChcInkgZCBzXCIpIC8vPT4gXCIxIDYgMlwiXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyB5ZWFyczogMSwgZGF5czogNiwgc2Vjb25kczogMiB9KS50b0Zvcm1hdChcInl5IGRkIHNzc1wiKSAvLz0+IFwiMDEgMDYgMDAyXCJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH0pLnRvRm9ybWF0KFwiTSBTXCIpIC8vPT4gXCIxMiA1MTg0MDIwMDBcIlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0Zvcm1hdChmbXQsIG9wdHMgPSB7fSkge1xuICAgIC8vIHJldmVyc2UtY29tcGF0IHNpbmNlIDEuMjsgd2UgYWx3YXlzIHJvdW5kIGRvd24gbm93LCBuZXZlciB1cCwgYW5kIHdlIGRvIGl0IGJ5IGRlZmF1bHRcbiAgICBjb25zdCBmbXRPcHRzID0ge1xuICAgICAgLi4ub3B0cyxcbiAgICAgIGZsb29yOiBvcHRzLnJvdW5kICE9PSBmYWxzZSAmJiBvcHRzLmZsb29yICE9PSBmYWxzZSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRcbiAgICAgID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYywgZm10T3B0cykuZm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKHRoaXMsIGZtdClcbiAgICAgIDogSU5WQUxJRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgSmF2YVNjcmlwdCBvYmplY3Qgd2l0aCB0aGlzIER1cmF0aW9uJ3MgdmFsdWVzLlxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgeWVhcnM6IDEsIGRheXM6IDYsIHNlY29uZHM6IDIgfSkudG9PYmplY3QoKSAvLz0+IHsgeWVhcnM6IDEsIGRheXM6IDYsIHNlY29uZHM6IDIgfVxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICB0b09iamVjdCgpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHt9O1xuICAgIHJldHVybiB7IC4uLnRoaXMudmFsdWVzIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24uXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjRHVyYXRpb25zXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyB5ZWFyczogMywgc2Vjb25kczogNDUgfSkudG9JU08oKSAvLz0+ICdQM1lUNDVTJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbW9udGhzOiA0LCBzZWNvbmRzOiA0NSB9KS50b0lTTygpIC8vPT4gJ1A0TVQ0NVMnXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBtb250aHM6IDUgfSkudG9JU08oKSAvLz0+ICdQNU0nXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBtaW51dGVzOiA1IH0pLnRvSVNPKCkgLy89PiAnUFQ1TSdcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IG1pbGxpc2Vjb25kczogNiB9KS50b0lTTygpIC8vPT4gJ1BUMC4wMDZTJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0lTTygpIHtcbiAgICAvLyB3ZSBjb3VsZCB1c2UgdGhlIGZvcm1hdHRlciwgYnV0IHRoaXMgaXMgYW4gZWFzaWVyIHdheSB0byBnZXQgdGhlIG1pbmltdW0gc3RyaW5nXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBudWxsO1xuXG4gICAgbGV0IHMgPSBcIlBcIjtcbiAgICBpZiAodGhpcy55ZWFycyAhPT0gMCkgcyArPSB0aGlzLnllYXJzICsgXCJZXCI7XG4gICAgaWYgKHRoaXMubW9udGhzICE9PSAwIHx8IHRoaXMucXVhcnRlcnMgIT09IDApIHMgKz0gdGhpcy5tb250aHMgKyB0aGlzLnF1YXJ0ZXJzICogMyArIFwiTVwiO1xuICAgIGlmICh0aGlzLndlZWtzICE9PSAwKSBzICs9IHRoaXMud2Vla3MgKyBcIldcIjtcbiAgICBpZiAodGhpcy5kYXlzICE9PSAwKSBzICs9IHRoaXMuZGF5cyArIFwiRFwiO1xuICAgIGlmICh0aGlzLmhvdXJzICE9PSAwIHx8IHRoaXMubWludXRlcyAhPT0gMCB8fCB0aGlzLnNlY29uZHMgIT09IDAgfHwgdGhpcy5taWxsaXNlY29uZHMgIT09IDApXG4gICAgICBzICs9IFwiVFwiO1xuICAgIGlmICh0aGlzLmhvdXJzICE9PSAwKSBzICs9IHRoaXMuaG91cnMgKyBcIkhcIjtcbiAgICBpZiAodGhpcy5taW51dGVzICE9PSAwKSBzICs9IHRoaXMubWludXRlcyArIFwiTVwiO1xuICAgIGlmICh0aGlzLnNlY29uZHMgIT09IDAgfHwgdGhpcy5taWxsaXNlY29uZHMgIT09IDApXG4gICAgICAvLyB0aGlzIHdpbGwgaGFuZGxlIFwiZmxvYXRpbmcgcG9pbnQgbWFkbmVzc1wiIGJ5IHJlbW92aW5nIGV4dHJhIGRlY2ltYWwgcGxhY2VzXG4gICAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81ODgwMDQvaXMtZmxvYXRpbmctcG9pbnQtbWF0aC1icm9rZW5cbiAgICAgIHMgKz0gcm91bmRUbyh0aGlzLnNlY29uZHMgKyB0aGlzLm1pbGxpc2Vjb25kcyAvIDEwMDAsIDMpICsgXCJTXCI7XG4gICAgaWYgKHMgPT09IFwiUFwiKSBzICs9IFwiVDBTXCI7XG4gICAgcmV0dXJuIHM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24sIGZvcm1hdHRlZCBhcyBhIHRpbWUgb2YgZGF5LlxuICAgKiBOb3RlIHRoYXQgdGhpcyB3aWxsIHJldHVybiBudWxsIGlmIHRoZSBkdXJhdGlvbiBpcyBpbnZhbGlkLCBuZWdhdGl2ZSwgb3IgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIDI0IGhvdXJzLlxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxI1RpbWVzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnN1cHByZXNzTWlsbGlzZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgbWlsbGlzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc1NlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlUHJlZml4PWZhbHNlXSAtIGluY2x1ZGUgdGhlIGBUYCBwcmVmaXhcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmZvcm1hdD0nZXh0ZW5kZWQnXSAtIGNob29zZSBiZXR3ZWVuIHRoZSBiYXNpYyBhbmQgZXh0ZW5kZWQgZm9ybWF0XG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMTEgfSkudG9JU09UaW1lKCkgLy89PiAnMTE6MDA6MDAuMDAwJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDExIH0pLnRvSVNPVGltZSh7IHN1cHByZXNzTWlsbGlzZWNvbmRzOiB0cnVlIH0pIC8vPT4gJzExOjAwOjAwJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDExIH0pLnRvSVNPVGltZSh7IHN1cHByZXNzU2Vjb25kczogdHJ1ZSB9KSAvLz0+ICcxMTowMCdcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxMSB9KS50b0lTT1RpbWUoeyBpbmNsdWRlUHJlZml4OiB0cnVlIH0pIC8vPT4gJ1QxMTowMDowMC4wMDAnXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMTEgfSkudG9JU09UaW1lKHsgZm9ybWF0OiAnYmFzaWMnIH0pIC8vPT4gJzExMDAwMC4wMDAnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvSVNPVGltZShvcHRzID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBtaWxsaXMgPSB0aGlzLnRvTWlsbGlzKCk7XG4gICAgaWYgKG1pbGxpcyA8IDAgfHwgbWlsbGlzID49IDg2NDAwMDAwKSByZXR1cm4gbnVsbDtcblxuICAgIG9wdHMgPSB7XG4gICAgICBzdXBwcmVzc01pbGxpc2Vjb25kczogZmFsc2UsXG4gICAgICBzdXBwcmVzc1NlY29uZHM6IGZhbHNlLFxuICAgICAgaW5jbHVkZVByZWZpeDogZmFsc2UsXG4gICAgICBmb3JtYXQ6IFwiZXh0ZW5kZWRcIixcbiAgICAgIC4uLm9wdHMsXG4gICAgfTtcblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5zaGlmdFRvKFwiaG91cnNcIiwgXCJtaW51dGVzXCIsIFwic2Vjb25kc1wiLCBcIm1pbGxpc2Vjb25kc1wiKTtcblxuICAgIGxldCBmbXQgPSBvcHRzLmZvcm1hdCA9PT0gXCJiYXNpY1wiID8gXCJoaG1tXCIgOiBcImhoOm1tXCI7XG5cbiAgICBpZiAoIW9wdHMuc3VwcHJlc3NTZWNvbmRzIHx8IHZhbHVlLnNlY29uZHMgIT09IDAgfHwgdmFsdWUubWlsbGlzZWNvbmRzICE9PSAwKSB7XG4gICAgICBmbXQgKz0gb3B0cy5mb3JtYXQgPT09IFwiYmFzaWNcIiA/IFwic3NcIiA6IFwiOnNzXCI7XG4gICAgICBpZiAoIW9wdHMuc3VwcHJlc3NNaWxsaXNlY29uZHMgfHwgdmFsdWUubWlsbGlzZWNvbmRzICE9PSAwKSB7XG4gICAgICAgIGZtdCArPSBcIi5TU1NcIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgc3RyID0gdmFsdWUudG9Gb3JtYXQoZm10KTtcblxuICAgIGlmIChvcHRzLmluY2x1ZGVQcmVmaXgpIHtcbiAgICAgIHN0ciA9IFwiVFwiICsgc3RyO1xuICAgIH1cblxuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIER1cmF0aW9uIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gSlNPTi5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvSVNPKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIER1cmF0aW9uIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gZGVidWdnaW5nLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy50b0lTTygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gbWlsbGlzZWNvbmRzIHZhbHVlIG9mIHRoaXMgRHVyYXRpb24uXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIHRvTWlsbGlzKCkge1xuICAgIHJldHVybiB0aGlzLmFzKFwibWlsbGlzZWNvbmRzXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gbWlsbGlzZWNvbmRzIHZhbHVlIG9mIHRoaXMgRHVyYXRpb24uIEFsaWFzIG9mIHtAbGluayB0b01pbGxpc31cbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgdmFsdWVPZigpIHtcbiAgICByZXR1cm4gdGhpcy50b01pbGxpcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgdGhpcyBEdXJhdGlvbiBsb25nZXIgYnkgdGhlIHNwZWNpZmllZCBhbW91bnQuIFJldHVybiBhIG5ld2x5LWNvbnN0cnVjdGVkIER1cmF0aW9uLlxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGFtb3VudCB0byBhZGQuIEVpdGhlciBhIEx1eG9uIER1cmF0aW9uLCBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIHRoZSBvYmplY3QgYXJndW1lbnQgdG8gRHVyYXRpb24uZnJvbU9iamVjdCgpXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgcGx1cyhkdXJhdGlvbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIGNvbnN0IGR1ciA9IGZyaWVuZGx5RHVyYXRpb24oZHVyYXRpb24pLFxuICAgICAgcmVzdWx0ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGsgb2Ygb3JkZXJlZFVuaXRzKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkoZHVyLnZhbHVlcywgaykgfHwgaGFzT3duUHJvcGVydHkodGhpcy52YWx1ZXMsIGspKSB7XG4gICAgICAgIHJlc3VsdFtrXSA9IGR1ci5nZXQoaykgKyB0aGlzLmdldChrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xvbmUodGhpcywgeyB2YWx1ZXM6IHJlc3VsdCB9LCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIHRoaXMgRHVyYXRpb24gc2hvcnRlciBieSB0aGUgc3BlY2lmaWVkIGFtb3VudC4gUmV0dXJuIGEgbmV3bHktY29uc3RydWN0ZWQgRHVyYXRpb24uXG4gICAqIEBwYXJhbSB7RHVyYXRpb258T2JqZWN0fG51bWJlcn0gZHVyYXRpb24gLSBUaGUgYW1vdW50IHRvIHN1YnRyYWN0LiBFaXRoZXIgYSBMdXhvbiBEdXJhdGlvbiwgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCB0aGUgb2JqZWN0IGFyZ3VtZW50IHRvIER1cmF0aW9uLmZyb21PYmplY3QoKVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIG1pbnVzKGR1cmF0aW9uKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuXG4gICAgY29uc3QgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbik7XG4gICAgcmV0dXJuIHRoaXMucGx1cyhkdXIubmVnYXRlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjYWxlIHRoaXMgRHVyYXRpb24gYnkgdGhlIHNwZWNpZmllZCBhbW91bnQuIFJldHVybiBhIG5ld2x5LWNvbnN0cnVjdGVkIER1cmF0aW9uLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBmbiAtIFRoZSBmdW5jdGlvbiB0byBhcHBseSB0byBlYWNoIHVuaXQuIEFyaXR5IGlzIDEgb3IgMjogdGhlIHZhbHVlIG9mIHRoZSB1bml0IGFuZCwgb3B0aW9uYWxseSwgdGhlIHVuaXQgbmFtZS4gTXVzdCByZXR1cm4gYSBudW1iZXIuXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMSwgbWludXRlczogMzAgfSkubWFwVW5pdHMoeCA9PiB4ICogMikgLy89PiB7IGhvdXJzOiAyLCBtaW51dGVzOiA2MCB9XG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMSwgbWludXRlczogMzAgfSkubWFwVW5pdHMoKHgsIHUpID0+IHUgPT09IFwiaG91clwiID8geCAqIDIgOiB4KSAvLz0+IHsgaG91cnM6IDIsIG1pbnV0ZXM6IDMwIH1cbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBtYXBVbml0cyhmbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXModGhpcy52YWx1ZXMpKSB7XG4gICAgICByZXN1bHRba10gPSBhc051bWJlcihmbih0aGlzLnZhbHVlc1trXSwgaykpO1xuICAgIH1cbiAgICByZXR1cm4gY2xvbmUodGhpcywgeyB2YWx1ZXM6IHJlc3VsdCB9LCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIHVuaXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gYSB1bml0IHN1Y2ggYXMgJ21pbnV0ZScgb3IgJ2RheSdcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDIsIGRheXM6IDN9KS5nZXQoJ3llYXJzJykgLy89PiAyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAyLCBkYXlzOiAzfSkuZ2V0KCdtb250aHMnKSAvLz0+IDBcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDIsIGRheXM6IDN9KS5nZXQoJ2RheXMnKSAvLz0+IDNcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0KHVuaXQpIHtcbiAgICByZXR1cm4gdGhpc1tEdXJhdGlvbi5ub3JtYWxpemVVbml0KHVuaXQpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcIlNldFwiIHRoZSB2YWx1ZXMgb2Ygc3BlY2lmaWVkIHVuaXRzLiBSZXR1cm4gYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlcyAtIGEgbWFwcGluZyBvZiB1bml0cyB0byBudW1iZXJzXG4gICAqIEBleGFtcGxlIGR1ci5zZXQoeyB5ZWFyczogMjAxNyB9KVxuICAgKiBAZXhhbXBsZSBkdXIuc2V0KHsgaG91cnM6IDgsIG1pbnV0ZXM6IDMwIH0pXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgc2V0KHZhbHVlcykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIGNvbnN0IG1peGVkID0geyAuLi50aGlzLnZhbHVlcywgLi4ubm9ybWFsaXplT2JqZWN0KHZhbHVlcywgRHVyYXRpb24ubm9ybWFsaXplVW5pdCkgfTtcbiAgICByZXR1cm4gY2xvbmUodGhpcywgeyB2YWx1ZXM6IG1peGVkIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIGxvY2FsZSBhbmQvb3IgbnVtYmVyaW5nU3lzdGVtLiAgUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIER1cmF0aW9uLlxuICAgKiBAZXhhbXBsZSBkdXIucmVjb25maWd1cmUoeyBsb2NhbGU6ICdlbi1HQicgfSlcbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICByZWNvbmZpZ3VyZSh7IGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBjb252ZXJzaW9uQWNjdXJhY3kgfSA9IHt9KSB7XG4gICAgY29uc3QgbG9jID0gdGhpcy5sb2MuY2xvbmUoeyBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSB9KSxcbiAgICAgIG9wdHMgPSB7IGxvYyB9O1xuXG4gICAgaWYgKGNvbnZlcnNpb25BY2N1cmFjeSkge1xuICAgICAgb3B0cy5jb252ZXJzaW9uQWNjdXJhY3kgPSBjb252ZXJzaW9uQWNjdXJhY3k7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBkdXJhdGlvbiBpbiB0aGUgc3BlY2lmaWVkIHVuaXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gYSB1bml0IHN1Y2ggYXMgJ21pbnV0ZXMnIG9yICdkYXlzJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHt5ZWFyczogMX0pLmFzKCdkYXlzJykgLy89PiAzNjVcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDF9KS5hcygnbW9udGhzJykgLy89PiAxMlxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHtob3VyczogNjB9KS5hcygnZGF5cycpIC8vPT4gMi41XG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGFzKHVuaXQpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5zaGlmdFRvKHVuaXQpLmdldCh1bml0KSA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWR1Y2UgdGhpcyBEdXJhdGlvbiB0byBpdHMgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIGluIGl0cyBjdXJyZW50IHVuaXRzLlxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgeWVhcnM6IDIsIGRheXM6IDUwMDAgfSkubm9ybWFsaXplKCkudG9PYmplY3QoKSAvLz0+IHsgeWVhcnM6IDE1LCBkYXlzOiAyNTUgfVxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEyLCBtaW51dGVzOiAtNDUgfSkubm9ybWFsaXplKCkudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAxNSB9XG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgbm9ybWFsaXplKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCB2YWxzID0gdGhpcy50b09iamVjdCgpO1xuICAgIG5vcm1hbGl6ZVZhbHVlcyh0aGlzLm1hdHJpeCwgdmFscyk7XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdmFsdWVzOiB2YWxzIH0sIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdGhpcyBEdXJhdGlvbiBpbnRvIGl0cyByZXByZXNlbnRhdGlvbiBpbiBhIGRpZmZlcmVudCBzZXQgb2YgdW5pdHMuXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMSwgc2Vjb25kczogMzAgfSkuc2hpZnRUbygnbWludXRlcycsICdtaWxsaXNlY29uZHMnKS50b09iamVjdCgpIC8vPT4geyBtaW51dGVzOiA2MCwgbWlsbGlzZWNvbmRzOiAzMDAwMCB9XG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgc2hpZnRUbyguLi51bml0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIGlmICh1bml0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHVuaXRzID0gdW5pdHMubWFwKCh1KSA9PiBEdXJhdGlvbi5ub3JtYWxpemVVbml0KHUpKTtcblxuICAgIGNvbnN0IGJ1aWx0ID0ge30sXG4gICAgICBhY2N1bXVsYXRlZCA9IHt9LFxuICAgICAgdmFscyA9IHRoaXMudG9PYmplY3QoKTtcbiAgICBsZXQgbGFzdFVuaXQ7XG5cbiAgICBmb3IgKGNvbnN0IGsgb2Ygb3JkZXJlZFVuaXRzKSB7XG4gICAgICBpZiAodW5pdHMuaW5kZXhPZihrKSA+PSAwKSB7XG4gICAgICAgIGxhc3RVbml0ID0gaztcblxuICAgICAgICBsZXQgb3duID0gMDtcblxuICAgICAgICAvLyBhbnl0aGluZyB3ZSBoYXZlbid0IGJvaWxlZCBkb3duIHlldCBzaG91bGQgZ2V0IGJvaWxlZCB0byB0aGlzIHVuaXRcbiAgICAgICAgZm9yIChjb25zdCBhayBpbiBhY2N1bXVsYXRlZCkge1xuICAgICAgICAgIG93biArPSB0aGlzLm1hdHJpeFtha11ba10gKiBhY2N1bXVsYXRlZFtha107XG4gICAgICAgICAgYWNjdW11bGF0ZWRbYWtdID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBsdXMgYW55dGhpbmcgdGhhdCdzIGFscmVhZHkgaW4gdGhpcyB1bml0XG4gICAgICAgIGlmIChpc051bWJlcih2YWxzW2tdKSkge1xuICAgICAgICAgIG93biArPSB2YWxzW2tdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaSA9IE1hdGgudHJ1bmMob3duKTtcbiAgICAgICAgYnVpbHRba10gPSBpO1xuICAgICAgICBhY2N1bXVsYXRlZFtrXSA9IG93biAtIGk7IC8vIHdlJ2QgbGlrZSB0byBhYnNvcmIgdGhlc2UgZnJhY3Rpb25zIGluIGFub3RoZXIgdW5pdFxuXG4gICAgICAgIC8vIHBsdXMgYW55dGhpbmcgZnVydGhlciBkb3duIHRoZSBjaGFpbiB0aGF0IHNob3VsZCBiZSByb2xsZWQgdXAgaW4gdG8gdGhpc1xuICAgICAgICBmb3IgKGNvbnN0IGRvd24gaW4gdmFscykge1xuICAgICAgICAgIGlmIChvcmRlcmVkVW5pdHMuaW5kZXhPZihkb3duKSA+IG9yZGVyZWRVbml0cy5pbmRleE9mKGspKSB7XG4gICAgICAgICAgICBjb252ZXJ0KHRoaXMubWF0cml4LCB2YWxzLCBkb3duLCBidWlsdCwgayk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIG90aGVyd2lzZSwga2VlcCBpdCBpbiB0aGUgd2luZ3MgdG8gYm9pbCBpdCBsYXRlclxuICAgICAgfSBlbHNlIGlmIChpc051bWJlcih2YWxzW2tdKSkge1xuICAgICAgICBhY2N1bXVsYXRlZFtrXSA9IHZhbHNba107XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYW55dGhpbmcgbGVmdG92ZXIgYmVjb21lcyB0aGUgZGVjaW1hbCBmb3IgdGhlIGxhc3QgdW5pdFxuICAgIC8vIGxhc3RVbml0IG11c3QgYmUgZGVmaW5lZCBzaW5jZSB1bml0cyBpcyBub3QgZW1wdHlcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhY2N1bXVsYXRlZCkge1xuICAgICAgaWYgKGFjY3VtdWxhdGVkW2tleV0gIT09IDApIHtcbiAgICAgICAgYnVpbHRbbGFzdFVuaXRdICs9XG4gICAgICAgICAga2V5ID09PSBsYXN0VW5pdCA/IGFjY3VtdWxhdGVkW2tleV0gOiBhY2N1bXVsYXRlZFtrZXldIC8gdGhpcy5tYXRyaXhbbGFzdFVuaXRdW2tleV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdmFsdWVzOiBidWlsdCB9LCB0cnVlKS5ub3JtYWxpemUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG5lZ2F0aXZlIG9mIHRoaXMgRHVyYXRpb24uXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMSwgc2Vjb25kczogMzAgfSkubmVnYXRlKCkudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IC0xLCBzZWNvbmRzOiAtMzAgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIG5lZ2F0ZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgY29uc3QgbmVnYXRlZCA9IHt9O1xuICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyh0aGlzLnZhbHVlcykpIHtcbiAgICAgIG5lZ2F0ZWRba10gPSAtdGhpcy52YWx1ZXNba107XG4gICAgfVxuICAgIHJldHVybiBjbG9uZSh0aGlzLCB7IHZhbHVlczogbmVnYXRlZCB9LCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHllYXJzLlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHllYXJzKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy55ZWFycyB8fCAwIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcXVhcnRlcnMuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgcXVhcnRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLnF1YXJ0ZXJzIHx8IDAgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtb250aHMuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgbW9udGhzKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5tb250aHMgfHwgMCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHdlZWtzXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgd2Vla3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLndlZWtzIHx8IDAgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkYXlzLlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGRheXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLmRheXMgfHwgMCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGhvdXJzLlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGhvdXJzKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5ob3VycyB8fCAwIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbWludXRlcy5cbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBtaW51dGVzKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5taW51dGVzIHx8IDAgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzZWNvbmRzLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgc2Vjb25kcygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMuc2Vjb25kcyB8fCAwIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbWlsbGlzZWNvbmRzLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgbWlsbGlzZWNvbmRzKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5taWxsaXNlY29uZHMgfHwgMCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIER1cmF0aW9uIGlzIGludmFsaWQuIEludmFsaWQgZHVyYXRpb25zIGFyZSByZXR1cm5lZCBieSBkaWZmIG9wZXJhdGlvbnNcbiAgICogb24gaW52YWxpZCBEYXRlVGltZXMgb3IgSW50ZXJ2YWxzLlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZ2V0IGlzVmFsaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW52YWxpZCA9PT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgaWYgdGhpcyBEdXJhdGlvbiBiZWNhbWUgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgRHVyYXRpb24gaXMgdmFsaWRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGludmFsaWRSZWFzb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW52YWxpZCA/IHRoaXMuaW52YWxpZC5yZWFzb24gOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgRHVyYXRpb24gYmVjYW1lIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIER1cmF0aW9uIGlzIHZhbGlkXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgaW52YWxpZEV4cGxhbmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmludmFsaWQgPyB0aGlzLmludmFsaWQuZXhwbGFuYXRpb24gOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEVxdWFsaXR5IGNoZWNrXG4gICAqIFR3byBEdXJhdGlvbnMgYXJlIGVxdWFsIGlmZiB0aGV5IGhhdmUgdGhlIHNhbWUgdW5pdHMgYW5kIHRoZSBzYW1lIHZhbHVlcyBmb3IgZWFjaCB1bml0LlxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufSBvdGhlclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZXF1YWxzKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQgfHwgIW90aGVyLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMubG9jLmVxdWFscyhvdGhlci5sb2MpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXEodjEsIHYyKSB7XG4gICAgICAvLyBDb25zaWRlciAwIGFuZCB1bmRlZmluZWQgYXMgZXF1YWxcbiAgICAgIGlmICh2MSA9PT0gdW5kZWZpbmVkIHx8IHYxID09PSAwKSByZXR1cm4gdjIgPT09IHVuZGVmaW5lZCB8fCB2MiA9PT0gMDtcbiAgICAgIHJldHVybiB2MSA9PT0gdjI7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB1IG9mIG9yZGVyZWRVbml0cykge1xuICAgICAgaWYgKCFlcSh0aGlzLnZhbHVlc1t1XSwgb3RoZXIudmFsdWVzW3VdKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyaWVuZGx5RHVyYXRpb24oZHVyYXRpb25pc2gpIHtcbiAgaWYgKGlzTnVtYmVyKGR1cmF0aW9uaXNoKSkge1xuICAgIHJldHVybiBEdXJhdGlvbi5mcm9tTWlsbGlzKGR1cmF0aW9uaXNoKTtcbiAgfSBlbHNlIGlmIChEdXJhdGlvbi5pc0R1cmF0aW9uKGR1cmF0aW9uaXNoKSkge1xuICAgIHJldHVybiBkdXJhdGlvbmlzaDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZHVyYXRpb25pc2ggPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gRHVyYXRpb24uZnJvbU9iamVjdChkdXJhdGlvbmlzaCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgYFVua25vd24gZHVyYXRpb24gYXJndW1lbnQgJHtkdXJhdGlvbmlzaH0gb2YgdHlwZSAke3R5cGVvZiBkdXJhdGlvbmlzaH1gXG4gICAgKTtcbiAgfVxufVxuIiwgImltcG9ydCBEYXRlVGltZSwgeyBmcmllbmRseURhdGVUaW1lIH0gZnJvbSBcIi4vZGF0ZXRpbWUuanNcIjtcbmltcG9ydCBEdXJhdGlvbiwgeyBmcmllbmRseUR1cmF0aW9uIH0gZnJvbSBcIi4vZHVyYXRpb24uanNcIjtcbmltcG9ydCBTZXR0aW5ncyBmcm9tIFwiLi9zZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IsIEludmFsaWRJbnRlcnZhbEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzLmpzXCI7XG5pbXBvcnQgSW52YWxpZCBmcm9tIFwiLi9pbXBsL2ludmFsaWQuanNcIjtcblxuY29uc3QgSU5WQUxJRCA9IFwiSW52YWxpZCBJbnRlcnZhbFwiO1xuXG4vLyBjaGVja3MgaWYgdGhlIHN0YXJ0IGlzIGVxdWFsIHRvIG9yIGJlZm9yZSB0aGUgZW5kXG5mdW5jdGlvbiB2YWxpZGF0ZVN0YXJ0RW5kKHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCB8fCAhc3RhcnQuaXNWYWxpZCkge1xuICAgIHJldHVybiBJbnRlcnZhbC5pbnZhbGlkKFwibWlzc2luZyBvciBpbnZhbGlkIHN0YXJ0XCIpO1xuICB9IGVsc2UgaWYgKCFlbmQgfHwgIWVuZC5pc1ZhbGlkKSB7XG4gICAgcmV0dXJuIEludGVydmFsLmludmFsaWQoXCJtaXNzaW5nIG9yIGludmFsaWQgZW5kXCIpO1xuICB9IGVsc2UgaWYgKGVuZCA8IHN0YXJ0KSB7XG4gICAgcmV0dXJuIEludGVydmFsLmludmFsaWQoXG4gICAgICBcImVuZCBiZWZvcmUgc3RhcnRcIixcbiAgICAgIGBUaGUgZW5kIG9mIGFuIGludGVydmFsIG11c3QgYmUgYWZ0ZXIgaXRzIHN0YXJ0LCBidXQgeW91IGhhZCBzdGFydD0ke3N0YXJ0LnRvSVNPKCl9IGFuZCBlbmQ9JHtlbmQudG9JU08oKX1gXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEFuIEludGVydmFsIG9iamVjdCByZXByZXNlbnRzIGEgaGFsZi1vcGVuIGludGVydmFsIG9mIHRpbWUsIHdoZXJlIGVhY2ggZW5kcG9pbnQgaXMgYSB7QGxpbmsgRGF0ZVRpbWV9LiBDb25jZXB0dWFsbHksIGl0J3MgYSBjb250YWluZXIgZm9yIHRob3NlIHR3byBlbmRwb2ludHMsIGFjY29tcGFuaWVkIGJ5IG1ldGhvZHMgZm9yIGNyZWF0aW5nLCBwYXJzaW5nLCBpbnRlcnJvZ2F0aW5nLCBjb21wYXJpbmcsIHRyYW5zZm9ybWluZywgYW5kIGZvcm1hdHRpbmcgdGhlbS5cbiAqXG4gKiBIZXJlIGlzIGEgYnJpZWYgb3ZlcnZpZXcgb2YgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBtZXRob2RzIGFuZCBnZXR0ZXJzIGluIEludGVydmFsOlxuICpcbiAqICogKipDcmVhdGlvbioqIFRvIGNyZWF0ZSBhbiBJbnRlcnZhbCwgdXNlIHtAbGluayBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzfSwge0BsaW5rIEludGVydmFsLmFmdGVyfSwge0BsaW5rIEludGVydmFsLmJlZm9yZX0sIG9yIHtAbGluayBJbnRlcnZhbC5mcm9tSVNPfS5cbiAqICogKipBY2Nlc3NvcnMqKiBVc2Uge0BsaW5rIEludGVydmFsI3N0YXJ0fSBhbmQge0BsaW5rIEludGVydmFsI2VuZH0gdG8gZ2V0IHRoZSBzdGFydCBhbmQgZW5kLlxuICogKiAqKkludGVycm9nYXRpb24qKiBUbyBhbmFseXplIHRoZSBJbnRlcnZhbCwgdXNlIHtAbGluayBJbnRlcnZhbCNjb3VudH0sIHtAbGluayBJbnRlcnZhbCNsZW5ndGh9LCB7QGxpbmsgSW50ZXJ2YWwjaGFzU2FtZX0sIHtAbGluayBJbnRlcnZhbCNjb250YWluc30sIHtAbGluayBJbnRlcnZhbCNpc0FmdGVyfSwgb3Ige0BsaW5rIEludGVydmFsI2lzQmVmb3JlfS5cbiAqICogKipUcmFuc2Zvcm1hdGlvbioqIFRvIGNyZWF0ZSBvdGhlciBJbnRlcnZhbHMgb3V0IG9mIHRoaXMgb25lLCB1c2Uge0BsaW5rIEludGVydmFsI3NldH0sIHtAbGluayBJbnRlcnZhbCNzcGxpdEF0fSwge0BsaW5rIEludGVydmFsI3NwbGl0Qnl9LCB7QGxpbmsgSW50ZXJ2YWwjZGl2aWRlRXF1YWxseX0sIHtAbGluayBJbnRlcnZhbCNtZXJnZX0sIHtAbGluayBJbnRlcnZhbCN4b3J9LCB7QGxpbmsgSW50ZXJ2YWwjdW5pb259LCB7QGxpbmsgSW50ZXJ2YWwjaW50ZXJzZWN0aW9ufSwgb3Ige0BsaW5rIEludGVydmFsI2RpZmZlcmVuY2V9LlxuICogKiAqKkNvbXBhcmlzb24qKiBUbyBjb21wYXJlIHRoaXMgSW50ZXJ2YWwgdG8gYW5vdGhlciBvbmUsIHVzZSB7QGxpbmsgSW50ZXJ2YWwjZXF1YWxzfSwge0BsaW5rIEludGVydmFsI292ZXJsYXBzfSwge0BsaW5rIEludGVydmFsI2FidXRzU3RhcnR9LCB7QGxpbmsgSW50ZXJ2YWwjYWJ1dHNFbmR9LCB7QGxpbmsgSW50ZXJ2YWwjZW5ndWxmc31cbiAqICogKipPdXRwdXQqKiBUbyBjb252ZXJ0IHRoZSBJbnRlcnZhbCBpbnRvIG90aGVyIHJlcHJlc2VudGF0aW9ucywgc2VlIHtAbGluayBJbnRlcnZhbCN0b1N0cmluZ30sIHtAbGluayBJbnRlcnZhbCN0b0lTT30sIHtAbGluayBJbnRlcnZhbCN0b0lTT0RhdGV9LCB7QGxpbmsgSW50ZXJ2YWwjdG9JU09UaW1lfSwge0BsaW5rIEludGVydmFsI3RvRm9ybWF0fSwgYW5kIHtAbGluayBJbnRlcnZhbCN0b0R1cmF0aW9ufS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW50ZXJ2YWwge1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMucyA9IGNvbmZpZy5zdGFydDtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmUgPSBjb25maWcuZW5kO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuaW52YWxpZCA9IGNvbmZpZy5pbnZhbGlkIHx8IG51bGw7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5pc0x1eG9uSW50ZXJ2YWwgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnZhbGlkIEludGVydmFsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uIC0gc2ltcGxlIHN0cmluZyBvZiB3aHkgdGhpcyBJbnRlcnZhbCBpcyBpbnZhbGlkLiBTaG91bGQgbm90IGNvbnRhaW4gcGFyYW1ldGVycyBvciBhbnl0aGluZyBlbHNlIGRhdGEtZGVwZW5kZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXhwbGFuYXRpb249bnVsbF0gLSBsb25nZXIgZXhwbGFuYXRpb24sIG1heSBpbmNsdWRlIHBhcmFtZXRlcnMgYW5kIG90aGVyIHVzZWZ1bCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqL1xuICBzdGF0aWMgaW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uID0gbnVsbCkge1xuICAgIGlmICghcmVhc29uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJuZWVkIHRvIHNwZWNpZnkgYSByZWFzb24gdGhlIEludGVydmFsIGlzIGludmFsaWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgaW52YWxpZCA9IHJlYXNvbiBpbnN0YW5jZW9mIEludmFsaWQgPyByZWFzb24gOiBuZXcgSW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uKTtcblxuICAgIGlmIChTZXR0aW5ncy50aHJvd09uSW52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRJbnRlcnZhbEVycm9yKGludmFsaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IEludGVydmFsKHsgaW52YWxpZCB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYSBzdGFydCBEYXRlVGltZSBhbmQgYW4gZW5kIERhdGVUaW1lLiBJbmNsdXNpdmUgb2YgdGhlIHN0YXJ0IGJ1dCBub3QgdGhlIGVuZC5cbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gc3RhcnRcbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gZW5kXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKi9cbiAgc3RhdGljIGZyb21EYXRlVGltZXMoc3RhcnQsIGVuZCkge1xuICAgIGNvbnN0IGJ1aWx0U3RhcnQgPSBmcmllbmRseURhdGVUaW1lKHN0YXJ0KSxcbiAgICAgIGJ1aWx0RW5kID0gZnJpZW5kbHlEYXRlVGltZShlbmQpO1xuXG4gICAgY29uc3QgdmFsaWRhdGVFcnJvciA9IHZhbGlkYXRlU3RhcnRFbmQoYnVpbHRTdGFydCwgYnVpbHRFbmQpO1xuXG4gICAgaWYgKHZhbGlkYXRlRXJyb3IgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG5ldyBJbnRlcnZhbCh7XG4gICAgICAgIHN0YXJ0OiBidWlsdFN0YXJ0LFxuICAgICAgICBlbmQ6IGJ1aWx0RW5kLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB2YWxpZGF0ZUVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gSW50ZXJ2YWwgZnJvbSBhIHN0YXJ0IERhdGVUaW1lIGFuZCBhIER1cmF0aW9uIHRvIGV4dGVuZCB0by5cbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gc3RhcnRcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIHRoZSBsZW5ndGggb2YgdGhlIEludGVydmFsLlxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cbiAgICovXG4gIHN0YXRpYyBhZnRlcihzdGFydCwgZHVyYXRpb24pIHtcbiAgICBjb25zdCBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKSxcbiAgICAgIGR0ID0gZnJpZW5kbHlEYXRlVGltZShzdGFydCk7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQsIGR0LnBsdXMoZHVyKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYW4gZW5kIERhdGVUaW1lIGFuZCBhIER1cmF0aW9uIHRvIGV4dGVuZCBiYWNrd2FyZHMgdG8uXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV8RGF0ZXxPYmplY3R9IGVuZFxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gdGhlIGxlbmd0aCBvZiB0aGUgSW50ZXJ2YWwuXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKi9cbiAgc3RhdGljIGJlZm9yZShlbmQsIGR1cmF0aW9uKSB7XG4gICAgY29uc3QgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbiksXG4gICAgICBkdCA9IGZyaWVuZGx5RGF0ZVRpbWUoZW5kKTtcbiAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdC5taW51cyhkdXIpLCBkdCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYW4gSVNPIDg2MDEgc3RyaW5nLlxuICAgKiBBY2NlcHRzIGA8c3RhcnQ+LzxlbmQ+YCwgYDxzdGFydD4vPGR1cmF0aW9uPmAsIGFuZCBgPGR1cmF0aW9uPi88ZW5kPmAgZm9ybWF0cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgSVNPIHN0cmluZyB0byBwYXJzZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdHNdIC0gb3B0aW9ucyB0byBwYXNzIHtAbGluayBEYXRlVGltZS5mcm9tSVNPfSBhbmQgb3B0aW9uYWxseSB7QGxpbmsgRHVyYXRpb24uZnJvbUlTT31cbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNUaW1lX2ludGVydmFsc1xuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cbiAgICovXG4gIHN0YXRpYyBmcm9tSVNPKHRleHQsIG9wdHMpIHtcbiAgICBjb25zdCBbcywgZV0gPSAodGV4dCB8fCBcIlwiKS5zcGxpdChcIi9cIiwgMik7XG4gICAgaWYgKHMgJiYgZSkge1xuICAgICAgbGV0IHN0YXJ0LCBzdGFydElzVmFsaWQ7XG4gICAgICB0cnkge1xuICAgICAgICBzdGFydCA9IERhdGVUaW1lLmZyb21JU08ocywgb3B0cyk7XG4gICAgICAgIHN0YXJ0SXNWYWxpZCA9IHN0YXJ0LmlzVmFsaWQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHN0YXJ0SXNWYWxpZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBsZXQgZW5kLCBlbmRJc1ZhbGlkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZW5kID0gRGF0ZVRpbWUuZnJvbUlTTyhlLCBvcHRzKTtcbiAgICAgICAgZW5kSXNWYWxpZCA9IGVuZC5pc1ZhbGlkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBlbmRJc1ZhbGlkID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGFydElzVmFsaWQgJiYgZW5kSXNWYWxpZCkge1xuICAgICAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzdGFydCwgZW5kKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXJ0SXNWYWxpZCkge1xuICAgICAgICBjb25zdCBkdXIgPSBEdXJhdGlvbi5mcm9tSVNPKGUsIG9wdHMpO1xuICAgICAgICBpZiAoZHVyLmlzVmFsaWQpIHtcbiAgICAgICAgICByZXR1cm4gSW50ZXJ2YWwuYWZ0ZXIoc3RhcnQsIGR1cik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZW5kSXNWYWxpZCkge1xuICAgICAgICBjb25zdCBkdXIgPSBEdXJhdGlvbi5mcm9tSVNPKHMsIG9wdHMpO1xuICAgICAgICBpZiAoZHVyLmlzVmFsaWQpIHtcbiAgICAgICAgICByZXR1cm4gSW50ZXJ2YWwuYmVmb3JlKGVuZCwgZHVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSW50ZXJ2YWwuaW52YWxpZChcInVucGFyc2FibGVcIiwgYHRoZSBpbnB1dCBcIiR7dGV4dH1cIiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBvYmplY3QgaXMgYW4gSW50ZXJ2YWwuIFdvcmtzIGFjcm9zcyBjb250ZXh0IGJvdW5kYXJpZXNcbiAgICogQHBhcmFtIHtvYmplY3R9IG9cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc0ludGVydmFsKG8pIHtcbiAgICByZXR1cm4gKG8gJiYgby5pc0x1eG9uSW50ZXJ2YWwpIHx8IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN0YXJ0IG9mIHRoZSBJbnRlcnZhbFxuICAgKiBAdHlwZSB7RGF0ZVRpbWV9XG4gICAqL1xuICBnZXQgc3RhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMucyA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZW5kIG9mIHRoZSBJbnRlcnZhbFxuICAgKiBAdHlwZSB7RGF0ZVRpbWV9XG4gICAqL1xuICBnZXQgZW5kKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmUgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGlzIEludGVydmFsJ3MgZW5kIGlzIGF0IGxlYXN0IGl0cyBzdGFydCwgbWVhbmluZyB0aGF0IHRoZSBJbnRlcnZhbCBpc24ndCAnYmFja3dhcmRzJy5cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkUmVhc29uID09PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGlzIEludGVydmFsIGlzIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIEludGVydmFsIGlzIHZhbGlkXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgaW52YWxpZFJlYXNvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLnJlYXNvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBJbnRlcnZhbCBiZWNhbWUgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgSW50ZXJ2YWwgaXMgdmFsaWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBpbnZhbGlkRXhwbGFuYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW52YWxpZCA/IHRoaXMuaW52YWxpZC5leHBsYW5hdGlvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBJbnRlcnZhbCBpbiB0aGUgc3BlY2lmaWVkIHVuaXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gdGhlIHVuaXQgKHN1Y2ggYXMgJ2hvdXJzJyBvciAnZGF5cycpIHRvIHJldHVybiB0aGUgbGVuZ3RoIGluLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBsZW5ndGgodW5pdCA9IFwibWlsbGlzZWNvbmRzXCIpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50b0R1cmF0aW9uKC4uLlt1bml0XSkuZ2V0KHVuaXQpIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvdW50IG9mIG1pbnV0ZXMsIGhvdXJzLCBkYXlzLCBtb250aHMsIG9yIHllYXJzIGluY2x1ZGVkIGluIHRoZSBJbnRlcnZhbCwgZXZlbiBpbiBwYXJ0LlxuICAgKiBVbmxpa2Uge0BsaW5rIEludGVydmFsI2xlbmd0aH0gdGhpcyBjb3VudHMgc2VjdGlvbnMgb2YgdGhlIGNhbGVuZGFyLCBub3QgcGVyaW9kcyBvZiB0aW1lLCBlLmcuIHNwZWNpZnlpbmcgJ2RheSdcbiAgICogYXNrcyAnd2hhdCBkYXRlcyBhcmUgaW5jbHVkZWQgaW4gdGhpcyBpbnRlcnZhbD8nLCBub3QgJ2hvdyBtYW55IGRheXMgbG9uZyBpcyB0aGlzIGludGVydmFsPydcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt1bml0PSdtaWxsaXNlY29uZHMnXSAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY291bnQuXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGNvdW50KHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBOYU47XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnN0YXJ0LnN0YXJ0T2YodW5pdCksXG4gICAgICBlbmQgPSB0aGlzLmVuZC5zdGFydE9mKHVuaXQpO1xuICAgIHJldHVybiBNYXRoLmZsb29yKGVuZC5kaWZmKHN0YXJ0LCB1bml0KS5nZXQodW5pdCkpICsgMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIHN0YXJ0IGFuZCBlbmQgYXJlIGJvdGggaW4gdGhlIHNhbWUgdW5pdCBvZiB0aW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gdGhlIHVuaXQgb2YgdGltZSB0byBjaGVjayBzYW1lbmVzcyBvblxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgaGFzU2FtZSh1bml0KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuaXNFbXB0eSgpIHx8IHRoaXMuZS5taW51cygxKS5oYXNTYW1lKHRoaXMucywgdW5pdCkgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsIGhhcyB0aGUgc2FtZSBzdGFydCBhbmQgZW5kIERhdGVUaW1lcy5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMucy52YWx1ZU9mKCkgPT09IHRoaXMuZS52YWx1ZU9mKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIHN0YXJ0IGlzIGFmdGVyIHRoZSBzcGVjaWZpZWQgRGF0ZVRpbWUuXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IGRhdGVUaW1lXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBpc0FmdGVyKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zID4gZGF0ZVRpbWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIGVuZCBpcyBiZWZvcmUgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cbiAgICogQHBhcmFtIHtEYXRlVGltZX0gZGF0ZVRpbWVcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQmVmb3JlKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5lIDw9IGRhdGVUaW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwgY29udGFpbnMgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cbiAgICogQHBhcmFtIHtEYXRlVGltZX0gZGF0ZVRpbWVcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGNvbnRhaW5zKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zIDw9IGRhdGVUaW1lICYmIHRoaXMuZSA+IGRhdGVUaW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0c1wiIHRoZSBzdGFydCBhbmQvb3IgZW5kIGRhdGVzLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgSW50ZXJ2YWwuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXMgLSB0aGUgdmFsdWVzIHRvIHNldFxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSB2YWx1ZXMuc3RhcnQgLSB0aGUgc3RhcnRpbmcgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gdmFsdWVzLmVuZCAtIHRoZSBlbmRpbmcgRGF0ZVRpbWVcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqL1xuICBzZXQoeyBzdGFydCwgZW5kIH0gPSB7fSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzdGFydCB8fCB0aGlzLnMsIGVuZCB8fCB0aGlzLmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0IHRoaXMgSW50ZXJ2YWwgYXQgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIERhdGVUaW1lc1xuICAgKiBAcGFyYW0gey4uLkRhdGVUaW1lfSBkYXRlVGltZXMgLSB0aGUgdW5pdCBvZiB0aW1lIHRvIGNvdW50LlxuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICovXG4gIHNwbGl0QXQoLi4uZGF0ZVRpbWVzKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBbXTtcbiAgICBjb25zdCBzb3J0ZWQgPSBkYXRlVGltZXNcbiAgICAgICAgLm1hcChmcmllbmRseURhdGVUaW1lKVxuICAgICAgICAuZmlsdGVyKChkKSA9PiB0aGlzLmNvbnRhaW5zKGQpKVxuICAgICAgICAuc29ydCgpLFxuICAgICAgcmVzdWx0cyA9IFtdO1xuICAgIGxldCB7IHMgfSA9IHRoaXMsXG4gICAgICBpID0gMDtcblxuICAgIHdoaWxlIChzIDwgdGhpcy5lKSB7XG4gICAgICBjb25zdCBhZGRlZCA9IHNvcnRlZFtpXSB8fCB0aGlzLmUsXG4gICAgICAgIG5leHQgPSArYWRkZWQgPiArdGhpcy5lID8gdGhpcy5lIDogYWRkZWQ7XG4gICAgICByZXN1bHRzLnB1c2goSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzLCBuZXh0KSk7XG4gICAgICBzID0gbmV4dDtcbiAgICAgIGkgKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdCB0aGlzIEludGVydmFsIGludG8gc21hbGxlciBJbnRlcnZhbHMsIGVhY2ggb2YgdGhlIHNwZWNpZmllZCBsZW5ndGguXG4gICAqIExlZnQgb3ZlciB0aW1lIGlzIGdyb3VwZWQgaW50byBhIHNtYWxsZXIgaW50ZXJ2YWxcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBsZW5ndGggb2YgZWFjaCByZXN1bHRpbmcgaW50ZXJ2YWwuXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgc3BsaXRCeShkdXJhdGlvbikge1xuICAgIGNvbnN0IGR1ciA9IGZyaWVuZGx5RHVyYXRpb24oZHVyYXRpb24pO1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQgfHwgIWR1ci5pc1ZhbGlkIHx8IGR1ci5hcyhcIm1pbGxpc2Vjb25kc1wiKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGxldCB7IHMgfSA9IHRoaXMsXG4gICAgICBpZHggPSAxLFxuICAgICAgbmV4dDtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgICB3aGlsZSAocyA8IHRoaXMuZSkge1xuICAgICAgY29uc3QgYWRkZWQgPSB0aGlzLnN0YXJ0LnBsdXMoZHVyLm1hcFVuaXRzKCh4KSA9PiB4ICogaWR4KSk7XG4gICAgICBuZXh0ID0gK2FkZGVkID4gK3RoaXMuZSA/IHRoaXMuZSA6IGFkZGVkO1xuICAgICAgcmVzdWx0cy5wdXNoKEludGVydmFsLmZyb21EYXRlVGltZXMocywgbmV4dCkpO1xuICAgICAgcyA9IG5leHQ7XG4gICAgICBpZHggKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdCB0aGlzIEludGVydmFsIGludG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc21hbGxlciBpbnRlcnZhbHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXJPZlBhcnRzIC0gVGhlIG51bWJlciBvZiBJbnRlcnZhbHMgdG8gZGl2aWRlIHRoZSBJbnRlcnZhbCBpbnRvLlxuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICovXG4gIGRpdmlkZUVxdWFsbHkobnVtYmVyT2ZQYXJ0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHRoaXMuc3BsaXRCeSh0aGlzLmxlbmd0aCgpIC8gbnVtYmVyT2ZQYXJ0cykuc2xpY2UoMCwgbnVtYmVyT2ZQYXJ0cyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBvdmVybGFwcyB3aXRoIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWxcbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIG92ZXJsYXBzKG90aGVyKSB7XG4gICAgcmV0dXJuIHRoaXMuZSA+IG90aGVyLnMgJiYgdGhpcy5zIDwgb3RoZXIuZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsJ3MgZW5kIGlzIGFkamFjZW50IHRvIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwncyBzdGFydC5cbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGFidXRzU3RhcnQob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiArdGhpcy5lID09PSArb3RoZXIucztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsJ3Mgc3RhcnQgaXMgYWRqYWNlbnQgdG8gdGhlIHNwZWNpZmllZCBJbnRlcnZhbCdzIGVuZC5cbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGFidXRzRW5kKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gK290aGVyLmUgPT09ICt0aGlzLnM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBlbmd1bGZzIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwuXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBlbmd1bGZzKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zIDw9IG90aGVyLnMgJiYgdGhpcy5lID49IG90aGVyLmU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBoYXMgdGhlIHNhbWUgc3RhcnQgYW5kIGVuZCBhcyB0aGUgc3BlY2lmaWVkIEludGVydmFsLlxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZXF1YWxzKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQgfHwgIW90aGVyLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zLmVxdWFscyhvdGhlci5zKSAmJiB0aGlzLmUuZXF1YWxzKG90aGVyLmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBJbnRlcnZhbCByZXByZXNlbnRpbmcgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIEludGVydmFsIGFuZCB0aGUgc3BlY2lmaWVkIEludGVydmFsLlxuICAgKiBTcGVjaWZpY2FsbHksIHRoZSByZXN1bHRpbmcgSW50ZXJ2YWwgaGFzIHRoZSBtYXhpbXVtIHN0YXJ0IHRpbWUgYW5kIHRoZSBtaW5pbXVtIGVuZCB0aW1lIG9mIHRoZSB0d28gSW50ZXJ2YWxzLlxuICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGludGVyc2VjdGlvbiBpcyBlbXB0eSwgbWVhbmluZywgdGhlIGludGVydmFscyBkb24ndCBpbnRlcnNlY3QuXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKi9cbiAgaW50ZXJzZWN0aW9uKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIGNvbnN0IHMgPSB0aGlzLnMgPiBvdGhlci5zID8gdGhpcy5zIDogb3RoZXIucyxcbiAgICAgIGUgPSB0aGlzLmUgPCBvdGhlci5lID8gdGhpcy5lIDogb3RoZXIuZTtcblxuICAgIGlmIChzID49IGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzLCBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHJlcHJlc2VudGluZyB0aGUgdW5pb24gb2YgdGhpcyBJbnRlcnZhbCBhbmQgdGhlIHNwZWNpZmllZCBJbnRlcnZhbC5cbiAgICogU3BlY2lmaWNhbGx5LCB0aGUgcmVzdWx0aW5nIEludGVydmFsIGhhcyB0aGUgbWluaW11bSBzdGFydCB0aW1lIGFuZCB0aGUgbWF4aW11bSBlbmQgdGltZSBvZiB0aGUgdHdvIEludGVydmFscy5cbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqL1xuICB1bmlvbihvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCBzID0gdGhpcy5zIDwgb3RoZXIucyA/IHRoaXMucyA6IG90aGVyLnMsXG4gICAgICBlID0gdGhpcy5lID4gb3RoZXIuZSA/IHRoaXMuZSA6IG90aGVyLmU7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMocywgZSk7XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2UgYW4gYXJyYXkgb2YgSW50ZXJ2YWxzIGludG8gYSBlcXVpdmFsZW50IG1pbmltYWwgc2V0IG9mIEludGVydmFscy5cbiAgICogQ29tYmluZXMgb3ZlcmxhcHBpbmcgYW5kIGFkamFjZW50IEludGVydmFscy5cbiAgICogQHBhcmFtIHtBcnJheX0gaW50ZXJ2YWxzXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgc3RhdGljIG1lcmdlKGludGVydmFscykge1xuICAgIGNvbnN0IFtmb3VuZCwgZmluYWxdID0gaW50ZXJ2YWxzXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5zIC0gYi5zKVxuICAgICAgLnJlZHVjZShcbiAgICAgICAgKFtzb2ZhciwgY3VycmVudF0sIGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoIWN1cnJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBbc29mYXIsIGl0ZW1dO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudC5vdmVybGFwcyhpdGVtKSB8fCBjdXJyZW50LmFidXRzU3RhcnQoaXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBbc29mYXIsIGN1cnJlbnQudW5pb24oaXRlbSldO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW3NvZmFyLmNvbmNhdChbY3VycmVudF0pLCBpdGVtXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtbXSwgbnVsbF1cbiAgICAgICk7XG4gICAgaWYgKGZpbmFsKSB7XG4gICAgICBmb3VuZC5wdXNoKGZpbmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBJbnRlcnZhbHMgcmVwcmVzZW50aW5nIHRoZSBzcGFucyBvZiB0aW1lIHRoYXQgb25seSBhcHBlYXIgaW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWxzLlxuICAgKiBAcGFyYW0ge0FycmF5fSBpbnRlcnZhbHNcbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICBzdGF0aWMgeG9yKGludGVydmFscykge1xuICAgIGxldCBzdGFydCA9IG51bGwsXG4gICAgICBjdXJyZW50Q291bnQgPSAwO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBbXSxcbiAgICAgIGVuZHMgPSBpbnRlcnZhbHMubWFwKChpKSA9PiBbXG4gICAgICAgIHsgdGltZTogaS5zLCB0eXBlOiBcInNcIiB9LFxuICAgICAgICB7IHRpbWU6IGkuZSwgdHlwZTogXCJlXCIgfSxcbiAgICAgIF0pLFxuICAgICAgZmxhdHRlbmVkID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdCguLi5lbmRzKSxcbiAgICAgIGFyciA9IGZsYXR0ZW5lZC5zb3J0KChhLCBiKSA9PiBhLnRpbWUgLSBiLnRpbWUpO1xuXG4gICAgZm9yIChjb25zdCBpIG9mIGFycikge1xuICAgICAgY3VycmVudENvdW50ICs9IGkudHlwZSA9PT0gXCJzXCIgPyAxIDogLTE7XG5cbiAgICAgIGlmIChjdXJyZW50Q291bnQgPT09IDEpIHtcbiAgICAgICAgc3RhcnQgPSBpLnRpbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3RhcnQgJiYgK3N0YXJ0ICE9PSAraS50aW1lKSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKEludGVydmFsLmZyb21EYXRlVGltZXMoc3RhcnQsIGkudGltZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBJbnRlcnZhbC5tZXJnZShyZXN1bHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gSW50ZXJ2YWwgcmVwcmVzZW50aW5nIHRoZSBzcGFuIG9mIHRpbWUgaW4gdGhpcyBJbnRlcnZhbCB0aGF0IGRvZXNuJ3Qgb3ZlcmxhcCB3aXRoIGFueSBvZiB0aGUgc3BlY2lmaWVkIEludGVydmFscy5cbiAgICogQHBhcmFtIHsuLi5JbnRlcnZhbH0gaW50ZXJ2YWxzXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgZGlmZmVyZW5jZSguLi5pbnRlcnZhbHMpIHtcbiAgICByZXR1cm4gSW50ZXJ2YWwueG9yKFt0aGlzXS5jb25jYXQoaW50ZXJ2YWxzKSlcbiAgICAgIC5tYXAoKGkpID0+IHRoaXMuaW50ZXJzZWN0aW9uKGkpKVxuICAgICAgLmZpbHRlcigoaSkgPT4gaSAmJiAhaS5pc0VtcHR5KCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBhcHByb3ByaWF0ZSBmb3IgZGVidWdnaW5nLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b1N0cmluZygpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQ7XG4gICAgcmV0dXJuIGBbJHt0aGlzLnMudG9JU08oKX0gXHUyMDEzICR7dGhpcy5lLnRvSVNPKCl9KWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgSW50ZXJ2YWwuXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBUaGUgc2FtZSBvcHRpb25zIGFzIHtAbGluayBEYXRlVGltZSN0b0lTT31cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU08ob3B0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gSU5WQUxJRDtcbiAgICByZXR1cm4gYCR7dGhpcy5zLnRvSVNPKG9wdHMpfS8ke3RoaXMuZS50b0lTTyhvcHRzKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBkYXRlIG9mIHRoaXMgSW50ZXJ2YWwuXG4gICAqIFRoZSB0aW1lIGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU09EYXRlKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gSU5WQUxJRDtcbiAgICByZXR1cm4gYCR7dGhpcy5zLnRvSVNPRGF0ZSgpfS8ke3RoaXMuZS50b0lTT0RhdGUoKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aW1lIG9mIHRoaXMgSW50ZXJ2YWwuXG4gICAqIFRoZSBkYXRlIGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBUaGUgc2FtZSBvcHRpb25zIGFzIHtAbGluayBEYXRlVGltZS50b0lTT31cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU09UaW1lKG9wdHMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQ7XG4gICAgcmV0dXJuIGAke3RoaXMucy50b0lTT1RpbWUob3B0cyl9LyR7dGhpcy5lLnRvSVNPVGltZShvcHRzKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGVGb3JtYXQgLSB0aGUgZm9ybWF0IHN0cmluZy4gVGhpcyBzdHJpbmcgZm9ybWF0cyB0aGUgc3RhcnQgYW5kIGVuZCB0aW1lLiBTZWUge0BsaW5rIERhdGVUaW1lLnRvRm9ybWF0fSBmb3IgZGV0YWlscy5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5zZXBhcmF0b3IgPSAgJyBcdTIwMTMgJ10gLSBhIHNlcGFyYXRvciB0byBwbGFjZSBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHJlcHJlc2VudGF0aW9uc1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0Zvcm1hdChkYXRlRm9ybWF0LCB7IHNlcGFyYXRvciA9IFwiIFx1MjAxMyBcIiB9ID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQ7XG4gICAgcmV0dXJuIGAke3RoaXMucy50b0Zvcm1hdChkYXRlRm9ybWF0KX0ke3NlcGFyYXRvcn0ke3RoaXMuZS50b0Zvcm1hdChkYXRlRm9ybWF0KX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIER1cmF0aW9uIHJlcHJlc2VudGluZyB0aGUgdGltZSBzcGFubmVkIGJ5IHRoaXMgaW50ZXJ2YWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdW5pdD1bJ21pbGxpc2Vjb25kcyddXSAtIHRoZSB1bml0IG9yIHVuaXRzIChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byBpbmNsdWRlIGluIHRoZSBkdXJhdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiB0aGUgRHVyYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oKS50b09iamVjdCgpIC8vPT4geyBtaWxsaXNlY29uZHM6IDg4NDg5MjU3IH1cbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikudG9EdXJhdGlvbignZGF5cycpLnRvT2JqZWN0KCkgLy89PiB7IGRheXM6IDEuMDI0MTgxMjE1Mjc3Nzc3OCB9XG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oWydob3VycycsICdtaW51dGVzJ10pLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAyNCwgbWludXRlczogMzQuODIwOTUgfVxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS50b0R1cmF0aW9uKFsnaG91cnMnLCAnbWludXRlcycsICdzZWNvbmRzJ10pLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAyNCwgbWludXRlczogMzQsIHNlY29uZHM6IDQ5LjI1NyB9XG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oJ3NlY29uZHMnKS50b09iamVjdCgpIC8vPT4geyBzZWNvbmRzOiA4ODQ4OS4yNTcgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHRvRHVyYXRpb24odW5pdCwgb3B0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZCh0aGlzLmludmFsaWRSZWFzb24pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lLmRpZmYodGhpcy5zLCB1bml0LCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gbWFwRm4gb24gdGhlIGludGVydmFsIHN0YXJ0IGFuZCBlbmQsIHJldHVybmluZyBhIG5ldyBJbnRlcnZhbCBmcm9tIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWVzXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG1hcEZuXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS5tYXBFbmRwb2ludHMoZW5kcG9pbnQgPT4gZW5kcG9pbnQudG9VVEMoKSlcbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikubWFwRW5kcG9pbnRzKGVuZHBvaW50ID0+IGVuZHBvaW50LnBsdXMoeyBob3VyczogMiB9KSlcbiAgICovXG4gIG1hcEVuZHBvaW50cyhtYXBGbikge1xuICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKG1hcEZuKHRoaXMucyksIG1hcEZuKHRoaXMuZSkpO1xuICB9XG59XG4iLCAiaW1wb3J0IERhdGVUaW1lIGZyb20gXCIuL2RhdGV0aW1lLmpzXCI7XG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4vc2V0dGluZ3MuanNcIjtcbmltcG9ydCBMb2NhbGUgZnJvbSBcIi4vaW1wbC9sb2NhbGUuanNcIjtcbmltcG9ydCBJQU5BWm9uZSBmcm9tIFwiLi96b25lcy9JQU5BWm9uZS5qc1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplWm9uZSB9IGZyb20gXCIuL2ltcGwvem9uZVV0aWwuanNcIjtcblxuaW1wb3J0IHsgaGFzUmVsYXRpdmUgfSBmcm9tIFwiLi9pbXBsL3V0aWwuanNcIjtcblxuLyoqXG4gKiBUaGUgSW5mbyBjbGFzcyBjb250YWlucyBzdGF0aWMgbWV0aG9kcyBmb3IgcmV0cmlldmluZyBnZW5lcmFsIHRpbWUgYW5kIGRhdGUgcmVsYXRlZCBkYXRhLiBGb3IgZXhhbXBsZSwgaXQgaGFzIG1ldGhvZHMgZm9yIGZpbmRpbmcgb3V0IGlmIGEgdGltZSB6b25lIGhhcyBhIERTVCwgZm9yIGxpc3RpbmcgdGhlIG1vbnRocyBpbiBhbnkgc3VwcG9ydGVkIGxvY2FsZSwgYW5kIGZvciBkaXNjb3ZlcmluZyB3aGljaCBvZiBMdXhvbiBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbmZvIHtcbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgem9uZSBjb250YWlucyBhIERTVC5cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW3pvbmU9J2xvY2FsJ10gLSBab25lIHRvIGNoZWNrLiBEZWZhdWx0cyB0byB0aGUgZW52aXJvbm1lbnQncyBsb2NhbCB6b25lLlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGhhc0RTVCh6b25lID0gU2V0dGluZ3MuZGVmYXVsdFpvbmUpIHtcbiAgICBjb25zdCBwcm90byA9IERhdGVUaW1lLm5vdygpLnNldFpvbmUoem9uZSkuc2V0KHsgbW9udGg6IDEyIH0pO1xuXG4gICAgcmV0dXJuICF6b25lLmlzVW5pdmVyc2FsICYmIHByb3RvLm9mZnNldCAhPT0gcHJvdG8uc2V0KHsgbW9udGg6IDYgfSkub2Zmc2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgem9uZSBpcyBhIHZhbGlkIElBTkEgc3BlY2lmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gem9uZSAtIFpvbmUgdG8gY2hlY2tcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc1ZhbGlkSUFOQVpvbmUoem9uZSkge1xuICAgIHJldHVybiBJQU5BWm9uZS5pc1ZhbGlkU3BlY2lmaWVyKHpvbmUpICYmIElBTkFab25lLmlzVmFsaWRab25lKHpvbmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBpbnB1dCBpbnRvIGEge0BsaW5rIFpvbmV9IGluc3RhbmNlLlxuICAgKlxuICAgKiAqIElmIGBpbnB1dGAgaXMgYWxyZWFkeSBhIFpvbmUgaW5zdGFuY2UsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC5cbiAgICogKiBJZiBgaW5wdXRgIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSB2YWxpZCB0aW1lIHpvbmUgbmFtZSwgYSBab25lIGluc3RhbmNlXG4gICAqICAgd2l0aCB0aGF0IG5hbWUgaXMgcmV0dXJuZWQuXG4gICAqICogSWYgYGlucHV0YCBpcyBhIHN0cmluZyB0aGF0IGRvZXNuJ3QgcmVmZXIgdG8gYSBrbm93biB0aW1lIHpvbmUsIGEgWm9uZVxuICAgKiAgIGluc3RhbmNlIHdpdGgge0BsaW5rIFpvbmUuaXNWYWxpZH0gPT0gZmFsc2UgaXMgcmV0dXJuZWQuXG4gICAqICogSWYgYGlucHV0IGlzIGEgbnVtYmVyLCBhIFpvbmUgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGZpeGVkIG9mZnNldFxuICAgKiAgIGluIG1pbnV0ZXMgaXMgcmV0dXJuZWQuXG4gICAqICogSWYgYGlucHV0YCBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAsIHRoZSBkZWZhdWx0IHpvbmUgaXMgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV8bnVtYmVyfSBbaW5wdXRdIC0gdGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZFxuICAgKiBAcmV0dXJuIHtab25lfVxuICAgKi9cbiAgc3RhdGljIG5vcm1hbGl6ZVpvbmUoaW5wdXQpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplWm9uZShpbnB1dCwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBzdGFuZGFsb25lIG1vbnRoIG5hbWVzLlxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVUaW1lRm9ybWF0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSBtb250aCByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcIm51bWVyaWNcIiwgXCIyLWRpZ2l0XCIsIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jT2JqPW51bGxdIC0gYW4gZXhpc3RpbmcgbG9jYWxlIG9iamVjdCB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm91dHB1dENhbGVuZGFyPSdncmVnb3J5J10gLSB0aGUgY2FsZW5kYXJcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoKVswXSAvLz0+ICdKYW51YXJ5J1xuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnc2hvcnQnKVswXSAvLz0+ICdKYW4nXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKCdudW1lcmljJylbMF0gLy89PiAnMSdcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ3Nob3J0JywgeyBsb2NhbGU6ICdmci1DQScgfSApWzBdIC8vPT4gJ2phbnYuJ1xuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnbnVtZXJpYycsIHsgbG9jYWxlOiAnYXInIH0pWzBdIC8vPT4gJ1x1MDY2MSdcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ2xvbmcnLCB7IG91dHB1dENhbGVuZGFyOiAnaXNsYW1pYycgfSlbMF0gLy89PiAnUmFiaVx1MDJCQiBJJ1xuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICovXG4gIHN0YXRpYyBtb250aHMoXG4gICAgbGVuZ3RoID0gXCJsb25nXCIsXG4gICAgeyBsb2NhbGUgPSBudWxsLCBudW1iZXJpbmdTeXN0ZW0gPSBudWxsLCBsb2NPYmogPSBudWxsLCBvdXRwdXRDYWxlbmRhciA9IFwiZ3JlZ29yeVwiIH0gPSB7fVxuICApIHtcbiAgICByZXR1cm4gKGxvY09iaiB8fCBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhcikpLm1vbnRocyhsZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBmb3JtYXQgbW9udGggbmFtZXMuXG4gICAqIEZvcm1hdCBtb250aHMgZGlmZmVyIGZyb20gc3RhbmRhbG9uZSBtb250aHMgaW4gdGhhdCB0aGV5J3JlIG1lYW50IHRvIGFwcGVhciBuZXh0IHRvIHRoZSBkYXkgb2YgdGhlIG1vbnRoLiBJbiBzb21lIGxhbmd1YWdlcywgdGhhdFxuICAgKiBjaGFuZ2VzIHRoZSBzdHJpbmcuXG4gICAqIFNlZSB7QGxpbmsgSW5mbyNtb250aHN9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSBtb250aCByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcIm51bWVyaWNcIiwgXCIyLWRpZ2l0XCIsIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jT2JqPW51bGxdIC0gYW4gZXhpc3RpbmcgbG9jYWxlIG9iamVjdCB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm91dHB1dENhbGVuZGFyPSdncmVnb3J5J10gLSB0aGUgY2FsZW5kYXJcbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICBzdGF0aWMgbW9udGhzRm9ybWF0KFxuICAgIGxlbmd0aCA9IFwibG9uZ1wiLFxuICAgIHsgbG9jYWxlID0gbnVsbCwgbnVtYmVyaW5nU3lzdGVtID0gbnVsbCwgbG9jT2JqID0gbnVsbCwgb3V0cHV0Q2FsZW5kYXIgPSBcImdyZWdvcnlcIiB9ID0ge31cbiAgKSB7XG4gICAgcmV0dXJuIChsb2NPYmogfHwgTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpKS5tb250aHMobGVuZ3RoLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2Ygc3RhbmRhbG9uZSB3ZWVrIG5hbWVzLlxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVUaW1lRm9ybWF0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSB3ZWVrZGF5IHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtPW51bGxdIC0gdGhlIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY09iaj1udWxsXSAtIGFuIGV4aXN0aW5nIGxvY2FsZSBvYmplY3QgdG8gdXNlXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoKVswXSAvLz0+ICdNb25kYXknXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoJ3Nob3J0JylbMF0gLy89PiAnTW9uJ1xuICAgKiBAZXhhbXBsZSBJbmZvLndlZWtkYXlzKCdzaG9ydCcsIHsgbG9jYWxlOiAnZnItQ0EnIH0pWzBdIC8vPT4gJ2x1bi4nXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoJ3Nob3J0JywgeyBsb2NhbGU6ICdhcicgfSlbMF0gLy89PiAnXHUwNjI3XHUwNjQ0XHUwNjI3XHUwNjJCXHUwNjQ2XHUwNjRBXHUwNjQ2J1xuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICovXG4gIHN0YXRpYyB3ZWVrZGF5cyhsZW5ndGggPSBcImxvbmdcIiwgeyBsb2NhbGUgPSBudWxsLCBudW1iZXJpbmdTeXN0ZW0gPSBudWxsLCBsb2NPYmogPSBudWxsIH0gPSB7fSkge1xuICAgIHJldHVybiAobG9jT2JqIHx8IExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG51bGwpKS53ZWVrZGF5cyhsZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBmb3JtYXQgd2VlayBuYW1lcy5cbiAgICogRm9ybWF0IHdlZWtkYXlzIGRpZmZlciBmcm9tIHN0YW5kYWxvbmUgd2Vla2RheXMgaW4gdGhhdCB0aGV5J3JlIG1lYW50IHRvIGFwcGVhciBuZXh0IHRvIG1vcmUgZGF0ZSBpbmZvcm1hdGlvbi4gSW4gc29tZSBsYW5ndWFnZXMsIHRoYXRcbiAgICogY2hhbmdlcyB0aGUgc3RyaW5nLlxuICAgKiBTZWUge0BsaW5rIEluZm8jd2Vla2RheXN9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSBtb250aCByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcIm5hcnJvd1wiLCBcInNob3J0XCIsIFwibG9uZ1wiLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT1udWxsXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtPW51bGxdIC0gdGhlIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY09iaj1udWxsXSAtIGFuIGV4aXN0aW5nIGxvY2FsZSBvYmplY3QgdG8gdXNlXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgc3RhdGljIHdlZWtkYXlzRm9ybWF0KFxuICAgIGxlbmd0aCA9IFwibG9uZ1wiLFxuICAgIHsgbG9jYWxlID0gbnVsbCwgbnVtYmVyaW5nU3lzdGVtID0gbnVsbCwgbG9jT2JqID0gbnVsbCB9ID0ge31cbiAgKSB7XG4gICAgcmV0dXJuIChsb2NPYmogfHwgTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgbnVsbCkpLndlZWtkYXlzKGxlbmd0aCwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIG1lcmlkaWVtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBleGFtcGxlIEluZm8ubWVyaWRpZW1zKCkgLy89PiBbICdBTScsICdQTScgXVxuICAgKiBAZXhhbXBsZSBJbmZvLm1lcmlkaWVtcyh7IGxvY2FsZTogJ215JyB9KSAvLz0+IFsgJ1x1MTAxNFx1MTAzNlx1MTAxNFx1MTAwMFx1MTAzQScsICdcdTEwMEFcdTEwMTRcdTEwMzEnIF1cbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICBzdGF0aWMgbWVyaWRpZW1zKHsgbG9jYWxlID0gbnVsbCB9ID0ge30pIHtcbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUpLm1lcmlkaWVtcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBlcmFzLCBzdWNoIGFzIFsnQkMnLCAnQUQnXS4gVGhlIGxvY2FsZSBjYW4gYmUgc3BlY2lmaWVkLCBidXQgdGhlIGNhbGVuZGFyIHN5c3RlbSBpcyBhbHdheXMgR3JlZ29yaWFuLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nc2hvcnQnXSAtIHRoZSBsZW5ndGggb2YgdGhlIGVyYSByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcInNob3J0XCIgb3IgXCJsb25nXCIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoKSAvLz0+IFsgJ0JDJywgJ0FEJyBdXG4gICAqIEBleGFtcGxlIEluZm8uZXJhcygnbG9uZycpIC8vPT4gWyAnQmVmb3JlIENocmlzdCcsICdBbm5vIERvbWluaScgXVxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoJ2xvbmcnLCB7IGxvY2FsZTogJ2ZyJyB9KSAvLz0+IFsgJ2F2YW50IEpcdTAwRTlzdXMtQ2hyaXN0JywgJ2Fwclx1MDBFOHMgSlx1MDBFOXN1cy1DaHJpc3QnIF1cbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICBzdGF0aWMgZXJhcyhsZW5ndGggPSBcInNob3J0XCIsIHsgbG9jYWxlID0gbnVsbCB9ID0ge30pIHtcbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bGwsIFwiZ3JlZ29yeVwiKS5lcmFzKGxlbmd0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBzZXQgb2YgYXZhaWxhYmxlIGZlYXR1cmVzIGluIHRoaXMgZW52aXJvbm1lbnQuXG4gICAqIFNvbWUgZmVhdHVyZXMgb2YgTHV4b24gYXJlIG5vdCBhdmFpbGFibGUgaW4gYWxsIGVudmlyb25tZW50cy4gRm9yIGV4YW1wbGUsIG9uIG9sZGVyIGJyb3dzZXJzLCB0aW1lem9uZSBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUuIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIGZpZ3VyZSBvdXQgaWYgdGhhdCdzIHRoZSBjYXNlLlxuICAgKiBLZXlzOlxuICAgKiAqIGByZWxhdGl2ZWA6IHdoZXRoZXIgdGhpcyBlbnZpcm9ubWVudCBzdXBwb3J0cyByZWxhdGl2ZSB0aW1lIGZvcm1hdHRpbmdcbiAgICogQGV4YW1wbGUgSW5mby5mZWF0dXJlcygpIC8vPT4geyBpbnRsOiB0cnVlLCBpbnRsVG9rZW5zOiBmYWxzZSwgem9uZXM6IHRydWUsIHJlbGF0aXZlOiBmYWxzZSB9XG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBmZWF0dXJlcygpIHtcbiAgICByZXR1cm4geyByZWxhdGl2ZTogaGFzUmVsYXRpdmUoKSB9O1xuICB9XG59XG4iLCAiaW1wb3J0IER1cmF0aW9uIGZyb20gXCIuLi9kdXJhdGlvbi5qc1wiO1xuXG5mdW5jdGlvbiBkYXlEaWZmKGVhcmxpZXIsIGxhdGVyKSB7XG4gIGNvbnN0IHV0Y0RheVN0YXJ0ID0gKGR0KSA9PiBkdC50b1VUQygwLCB7IGtlZXBMb2NhbFRpbWU6IHRydWUgfSkuc3RhcnRPZihcImRheVwiKS52YWx1ZU9mKCksXG4gICAgbXMgPSB1dGNEYXlTdGFydChsYXRlcikgLSB1dGNEYXlTdGFydChlYXJsaWVyKTtcbiAgcmV0dXJuIE1hdGguZmxvb3IoRHVyYXRpb24uZnJvbU1pbGxpcyhtcykuYXMoXCJkYXlzXCIpKTtcbn1cblxuZnVuY3Rpb24gaGlnaE9yZGVyRGlmZnMoY3Vyc29yLCBsYXRlciwgdW5pdHMpIHtcbiAgY29uc3QgZGlmZmVycyA9IFtcbiAgICBbXCJ5ZWFyc1wiLCAoYSwgYikgPT4gYi55ZWFyIC0gYS55ZWFyXSxcbiAgICBbXCJxdWFydGVyc1wiLCAoYSwgYikgPT4gYi5xdWFydGVyIC0gYS5xdWFydGVyXSxcbiAgICBbXCJtb250aHNcIiwgKGEsIGIpID0+IGIubW9udGggLSBhLm1vbnRoICsgKGIueWVhciAtIGEueWVhcikgKiAxMl0sXG4gICAgW1xuICAgICAgXCJ3ZWVrc1wiLFxuICAgICAgKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgZGF5cyA9IGRheURpZmYoYSwgYik7XG4gICAgICAgIHJldHVybiAoZGF5cyAtIChkYXlzICUgNykpIC8gNztcbiAgICAgIH0sXG4gICAgXSxcbiAgICBbXCJkYXlzXCIsIGRheURpZmZdLFxuICBdO1xuXG4gIGNvbnN0IHJlc3VsdHMgPSB7fTtcbiAgbGV0IGxvd2VzdE9yZGVyLCBoaWdoV2F0ZXI7XG5cbiAgZm9yIChjb25zdCBbdW5pdCwgZGlmZmVyXSBvZiBkaWZmZXJzKSB7XG4gICAgaWYgKHVuaXRzLmluZGV4T2YodW5pdCkgPj0gMCkge1xuICAgICAgbG93ZXN0T3JkZXIgPSB1bml0O1xuXG4gICAgICBsZXQgZGVsdGEgPSBkaWZmZXIoY3Vyc29yLCBsYXRlcik7XG4gICAgICBoaWdoV2F0ZXIgPSBjdXJzb3IucGx1cyh7IFt1bml0XTogZGVsdGEgfSk7XG5cbiAgICAgIGlmIChoaWdoV2F0ZXIgPiBsYXRlcikge1xuICAgICAgICBjdXJzb3IgPSBjdXJzb3IucGx1cyh7IFt1bml0XTogZGVsdGEgLSAxIH0pO1xuICAgICAgICBkZWx0YSAtPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3Vyc29yID0gaGlnaFdhdGVyO1xuICAgICAgfVxuXG4gICAgICByZXN1bHRzW3VuaXRdID0gZGVsdGE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFtjdXJzb3IsIHJlc3VsdHMsIGhpZ2hXYXRlciwgbG93ZXN0T3JkZXJdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoZWFybGllciwgbGF0ZXIsIHVuaXRzLCBvcHRzKSB7XG4gIGxldCBbY3Vyc29yLCByZXN1bHRzLCBoaWdoV2F0ZXIsIGxvd2VzdE9yZGVyXSA9IGhpZ2hPcmRlckRpZmZzKGVhcmxpZXIsIGxhdGVyLCB1bml0cyk7XG5cbiAgY29uc3QgcmVtYWluaW5nTWlsbGlzID0gbGF0ZXIgLSBjdXJzb3I7XG5cbiAgY29uc3QgbG93ZXJPcmRlclVuaXRzID0gdW5pdHMuZmlsdGVyKFxuICAgICh1KSA9PiBbXCJob3Vyc1wiLCBcIm1pbnV0ZXNcIiwgXCJzZWNvbmRzXCIsIFwibWlsbGlzZWNvbmRzXCJdLmluZGV4T2YodSkgPj0gMFxuICApO1xuXG4gIGlmIChsb3dlck9yZGVyVW5pdHMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGhpZ2hXYXRlciA8IGxhdGVyKSB7XG4gICAgICBoaWdoV2F0ZXIgPSBjdXJzb3IucGx1cyh7IFtsb3dlc3RPcmRlcl06IDEgfSk7XG4gICAgfVxuXG4gICAgaWYgKGhpZ2hXYXRlciAhPT0gY3Vyc29yKSB7XG4gICAgICByZXN1bHRzW2xvd2VzdE9yZGVyXSA9IChyZXN1bHRzW2xvd2VzdE9yZGVyXSB8fCAwKSArIHJlbWFpbmluZ01pbGxpcyAvIChoaWdoV2F0ZXIgLSBjdXJzb3IpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGR1cmF0aW9uID0gRHVyYXRpb24uZnJvbU9iamVjdChyZXN1bHRzLCBvcHRzKTtcblxuICBpZiAobG93ZXJPcmRlclVuaXRzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gRHVyYXRpb24uZnJvbU1pbGxpcyhyZW1haW5pbmdNaWxsaXMsIG9wdHMpXG4gICAgICAuc2hpZnRUbyguLi5sb3dlck9yZGVyVW5pdHMpXG4gICAgICAucGx1cyhkdXJhdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGR1cmF0aW9uO1xuICB9XG59XG4iLCAiY29uc3QgbnVtYmVyaW5nU3lzdGVtcyA9IHtcbiAgYXJhYjogXCJbXFx1MDY2MC1cXHUwNjY5XVwiLFxuICBhcmFiZXh0OiBcIltcXHUwNkYwLVxcdTA2RjldXCIsXG4gIGJhbGk6IFwiW1xcdTFCNTAtXFx1MUI1OV1cIixcbiAgYmVuZzogXCJbXFx1MDlFNi1cXHUwOUVGXVwiLFxuICBkZXZhOiBcIltcXHUwOTY2LVxcdTA5NkZdXCIsXG4gIGZ1bGx3aWRlOiBcIltcXHVGRjEwLVxcdUZGMTldXCIsXG4gIGd1anI6IFwiW1xcdTBBRTYtXFx1MEFFRl1cIixcbiAgaGFuaWRlYzogXCJbXHUzMDA3fFx1NEUwMHxcdTRFOEN8XHU0RTA5fFx1NTZEQnxcdTRFOTR8XHU1MTZEfFx1NEUwM3xcdTUxNkJ8XHU0RTVEXVwiLFxuICBraG1yOiBcIltcXHUxN0UwLVxcdTE3RTldXCIsXG4gIGtuZGE6IFwiW1xcdTBDRTYtXFx1MENFRl1cIixcbiAgbGFvbzogXCJbXFx1MEVEMC1cXHUwRUQ5XVwiLFxuICBsaW1iOiBcIltcXHUxOTQ2LVxcdTE5NEZdXCIsXG4gIG1seW06IFwiW1xcdTBENjYtXFx1MEQ2Rl1cIixcbiAgbW9uZzogXCJbXFx1MTgxMC1cXHUxODE5XVwiLFxuICBteW1yOiBcIltcXHUxMDQwLVxcdTEwNDldXCIsXG4gIG9yeWE6IFwiW1xcdTBCNjYtXFx1MEI2Rl1cIixcbiAgdGFtbGRlYzogXCJbXFx1MEJFNi1cXHUwQkVGXVwiLFxuICB0ZWx1OiBcIltcXHUwQzY2LVxcdTBDNkZdXCIsXG4gIHRoYWk6IFwiW1xcdTBFNTAtXFx1MEU1OV1cIixcbiAgdGlidDogXCJbXFx1MEYyMC1cXHUwRjI5XVwiLFxuICBsYXRuOiBcIlxcXFxkXCIsXG59O1xuXG5jb25zdCBudW1iZXJpbmdTeXN0ZW1zVVRGMTYgPSB7XG4gIGFyYWI6IFsxNjMyLCAxNjQxXSxcbiAgYXJhYmV4dDogWzE3NzYsIDE3ODVdLFxuICBiYWxpOiBbNjk5MiwgNzAwMV0sXG4gIGJlbmc6IFsyNTM0LCAyNTQzXSxcbiAgZGV2YTogWzI0MDYsIDI0MTVdLFxuICBmdWxsd2lkZTogWzY1Mjk2LCA2NTMwM10sXG4gIGd1anI6IFsyNzkwLCAyNzk5XSxcbiAga2htcjogWzYxMTIsIDYxMjFdLFxuICBrbmRhOiBbMzMwMiwgMzMxMV0sXG4gIGxhb286IFszNzkyLCAzODAxXSxcbiAgbGltYjogWzY0NzAsIDY0NzldLFxuICBtbHltOiBbMzQzMCwgMzQzOV0sXG4gIG1vbmc6IFs2MTYwLCA2MTY5XSxcbiAgbXltcjogWzQxNjAsIDQxNjldLFxuICBvcnlhOiBbMjkxOCwgMjkyN10sXG4gIHRhbWxkZWM6IFszMDQ2LCAzMDU1XSxcbiAgdGVsdTogWzMxNzQsIDMxODNdLFxuICB0aGFpOiBbMzY2NCwgMzY3M10sXG4gIHRpYnQ6IFszODcyLCAzODgxXSxcbn07XG5cbmNvbnN0IGhhbmlkZWNDaGFycyA9IG51bWJlcmluZ1N5c3RlbXMuaGFuaWRlYy5yZXBsYWNlKC9bXFxbfFxcXV0vZywgXCJcIikuc3BsaXQoXCJcIik7XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURpZ2l0cyhzdHIpIHtcbiAgbGV0IHZhbHVlID0gcGFyc2VJbnQoc3RyLCAxMCk7XG4gIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICB2YWx1ZSA9IFwiXCI7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcblxuICAgICAgaWYgKHN0cltpXS5zZWFyY2gobnVtYmVyaW5nU3lzdGVtcy5oYW5pZGVjKSAhPT0gLTEpIHtcbiAgICAgICAgdmFsdWUgKz0gaGFuaWRlY0NoYXJzLmluZGV4T2Yoc3RyW2ldKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG51bWJlcmluZ1N5c3RlbXNVVEYxNikge1xuICAgICAgICAgIGNvbnN0IFttaW4sIG1heF0gPSBudW1iZXJpbmdTeXN0ZW1zVVRGMTZba2V5XTtcbiAgICAgICAgICBpZiAoY29kZSA+PSBtaW4gJiYgY29kZSA8PSBtYXgpIHtcbiAgICAgICAgICAgIHZhbHVlICs9IGNvZGUgLSBtaW47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJzZUludCh2YWx1ZSwgMTApO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGlnaXRSZWdleCh7IG51bWJlcmluZ1N5c3RlbSB9LCBhcHBlbmQgPSBcIlwiKSB7XG4gIHJldHVybiBuZXcgUmVnRXhwKGAke251bWJlcmluZ1N5c3RlbXNbbnVtYmVyaW5nU3lzdGVtIHx8IFwibGF0blwiXX0ke2FwcGVuZH1gKTtcbn1cbiIsICJpbXBvcnQgeyBwYXJzZU1pbGxpcywgaXNVbmRlZmluZWQsIHVudHJ1bmNhdGVZZWFyLCBzaWduZWRPZmZzZXQsIGhhc093blByb3BlcnR5IH0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuaW1wb3J0IEZvcm1hdHRlciBmcm9tIFwiLi9mb3JtYXR0ZXIuanNcIjtcbmltcG9ydCBGaXhlZE9mZnNldFpvbmUgZnJvbSBcIi4uL3pvbmVzL2ZpeGVkT2Zmc2V0Wm9uZS5qc1wiO1xuaW1wb3J0IElBTkFab25lIGZyb20gXCIuLi96b25lcy9JQU5BWm9uZS5qc1wiO1xuaW1wb3J0IERhdGVUaW1lIGZyb20gXCIuLi9kYXRldGltZS5qc1wiO1xuaW1wb3J0IHsgZGlnaXRSZWdleCwgcGFyc2VEaWdpdHMgfSBmcm9tIFwiLi9kaWdpdHMuanNcIjtcbmltcG9ydCB7IENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy5qc1wiO1xuXG5jb25zdCBNSVNTSU5HX0ZUUCA9IFwibWlzc2luZyBJbnRsLkRhdGVUaW1lRm9ybWF0LmZvcm1hdFRvUGFydHMgc3VwcG9ydFwiO1xuXG5mdW5jdGlvbiBpbnRVbml0KHJlZ2V4LCBwb3N0ID0gKGkpID0+IGkpIHtcbiAgcmV0dXJuIHsgcmVnZXgsIGRlc2VyOiAoW3NdKSA9PiBwb3N0KHBhcnNlRGlnaXRzKHMpKSB9O1xufVxuXG5jb25zdCBOQlNQID0gU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApO1xuY29uc3Qgc3BhY2VPck5CU1AgPSBgKCB8JHtOQlNQfSlgO1xuY29uc3Qgc3BhY2VPck5CU1BSZWdFeHAgPSBuZXcgUmVnRXhwKHNwYWNlT3JOQlNQLCBcImdcIik7XG5cbmZ1bmN0aW9uIGZpeExpc3RSZWdleChzKSB7XG4gIC8vIG1ha2UgZG90cyBvcHRpb25hbCBhbmQgYWxzbyBtYWtlIHRoZW0gbGl0ZXJhbFxuICAvLyBtYWtlIHNwYWNlIGFuZCBub24gYnJlYWthYmxlIHNwYWNlIGNoYXJhY3RlcnMgaW50ZXJjaGFuZ2VhYmxlXG4gIHJldHVybiBzLnJlcGxhY2UoL1xcLi9nLCBcIlxcXFwuP1wiKS5yZXBsYWNlKHNwYWNlT3JOQlNQUmVnRXhwLCBzcGFjZU9yTkJTUCk7XG59XG5cbmZ1bmN0aW9uIHN0cmlwSW5zZW5zaXRpdml0aWVzKHMpIHtcbiAgcmV0dXJuIHNcbiAgICAucmVwbGFjZSgvXFwuL2csIFwiXCIpIC8vIGlnbm9yZSBkb3RzIHRoYXQgd2VyZSBtYWRlIG9wdGlvbmFsXG4gICAgLnJlcGxhY2Uoc3BhY2VPck5CU1BSZWdFeHAsIFwiIFwiKSAvLyBpbnRlcmNoYW5nZSBzcGFjZSBhbmQgbmJzcFxuICAgIC50b0xvd2VyQ2FzZSgpO1xufVxuXG5mdW5jdGlvbiBvbmVPZihzdHJpbmdzLCBzdGFydEluZGV4KSB7XG4gIGlmIChzdHJpbmdzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZ2V4OiBSZWdFeHAoc3RyaW5ncy5tYXAoZml4TGlzdFJlZ2V4KS5qb2luKFwifFwiKSksXG4gICAgICBkZXNlcjogKFtzXSkgPT5cbiAgICAgICAgc3RyaW5ncy5maW5kSW5kZXgoKGkpID0+IHN0cmlwSW5zZW5zaXRpdml0aWVzKHMpID09PSBzdHJpcEluc2Vuc2l0aXZpdGllcyhpKSkgKyBzdGFydEluZGV4LFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gb2Zmc2V0KHJlZ2V4LCBncm91cHMpIHtcbiAgcmV0dXJuIHsgcmVnZXgsIGRlc2VyOiAoWywgaCwgbV0pID0+IHNpZ25lZE9mZnNldChoLCBtKSwgZ3JvdXBzIH07XG59XG5cbmZ1bmN0aW9uIHNpbXBsZShyZWdleCkge1xuICByZXR1cm4geyByZWdleCwgZGVzZXI6IChbc10pID0+IHMgfTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlVG9rZW4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1tcXC1cXFtcXF17fSgpKis/LixcXFxcXFxeJHwjXFxzXS9nLCBcIlxcXFwkJlwiKTtcbn1cblxuZnVuY3Rpb24gdW5pdEZvclRva2VuKHRva2VuLCBsb2MpIHtcbiAgY29uc3Qgb25lID0gZGlnaXRSZWdleChsb2MpLFxuICAgIHR3byA9IGRpZ2l0UmVnZXgobG9jLCBcInsyfVwiKSxcbiAgICB0aHJlZSA9IGRpZ2l0UmVnZXgobG9jLCBcInszfVwiKSxcbiAgICBmb3VyID0gZGlnaXRSZWdleChsb2MsIFwiezR9XCIpLFxuICAgIHNpeCA9IGRpZ2l0UmVnZXgobG9jLCBcIns2fVwiKSxcbiAgICBvbmVPclR3byA9IGRpZ2l0UmVnZXgobG9jLCBcInsxLDJ9XCIpLFxuICAgIG9uZVRvVGhyZWUgPSBkaWdpdFJlZ2V4KGxvYywgXCJ7MSwzfVwiKSxcbiAgICBvbmVUb1NpeCA9IGRpZ2l0UmVnZXgobG9jLCBcInsxLDZ9XCIpLFxuICAgIG9uZVRvTmluZSA9IGRpZ2l0UmVnZXgobG9jLCBcInsxLDl9XCIpLFxuICAgIHR3b1RvRm91ciA9IGRpZ2l0UmVnZXgobG9jLCBcInsyLDR9XCIpLFxuICAgIGZvdXJUb1NpeCA9IGRpZ2l0UmVnZXgobG9jLCBcIns0LDZ9XCIpLFxuICAgIGxpdGVyYWwgPSAodCkgPT4gKHsgcmVnZXg6IFJlZ0V4cChlc2NhcGVUb2tlbih0LnZhbCkpLCBkZXNlcjogKFtzXSkgPT4gcywgbGl0ZXJhbDogdHJ1ZSB9KSxcbiAgICB1bml0YXRlID0gKHQpID0+IHtcbiAgICAgIGlmICh0b2tlbi5saXRlcmFsKSB7XG4gICAgICAgIHJldHVybiBsaXRlcmFsKHQpO1xuICAgICAgfVxuICAgICAgc3dpdGNoICh0LnZhbCkge1xuICAgICAgICAvLyBlcmFcbiAgICAgICAgY2FzZSBcIkdcIjpcbiAgICAgICAgICByZXR1cm4gb25lT2YobG9jLmVyYXMoXCJzaG9ydFwiLCBmYWxzZSksIDApO1xuICAgICAgICBjYXNlIFwiR0dcIjpcbiAgICAgICAgICByZXR1cm4gb25lT2YobG9jLmVyYXMoXCJsb25nXCIsIGZhbHNlKSwgMCk7XG4gICAgICAgIC8vIHllYXJzXG4gICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQob25lVG9TaXgpO1xuICAgICAgICBjYXNlIFwieXlcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdCh0d29Ub0ZvdXIsIHVudHJ1bmNhdGVZZWFyKTtcbiAgICAgICAgY2FzZSBcInl5eXlcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChmb3VyKTtcbiAgICAgICAgY2FzZSBcInl5eXl5XCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQoZm91clRvU2l4KTtcbiAgICAgICAgY2FzZSBcInl5eXl5eVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHNpeCk7XG4gICAgICAgIC8vIG1vbnRoc1xuICAgICAgICBjYXNlIFwiTVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcIk1NXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgICAgY2FzZSBcIk1NTVwiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2MubW9udGhzKFwic2hvcnRcIiwgdHJ1ZSwgZmFsc2UpLCAxKTtcbiAgICAgICAgY2FzZSBcIk1NTU1cIjpcbiAgICAgICAgICByZXR1cm4gb25lT2YobG9jLm1vbnRocyhcImxvbmdcIiwgdHJ1ZSwgZmFsc2UpLCAxKTtcbiAgICAgICAgY2FzZSBcIkxcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICAgIGNhc2UgXCJMTFwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAgIGNhc2UgXCJMTExcIjpcbiAgICAgICAgICByZXR1cm4gb25lT2YobG9jLm1vbnRocyhcInNob3J0XCIsIGZhbHNlLCBmYWxzZSksIDEpO1xuICAgICAgICBjYXNlIFwiTExMTFwiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2MubW9udGhzKFwibG9uZ1wiLCBmYWxzZSwgZmFsc2UpLCAxKTtcbiAgICAgICAgLy8gZGF0ZXNcbiAgICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICAgIGNhc2UgXCJkZFwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAgIC8vIG9yZGluYWxzXG4gICAgICAgIGNhc2UgXCJvXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQob25lVG9UaHJlZSk7XG4gICAgICAgIGNhc2UgXCJvb29cIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdCh0aHJlZSk7XG4gICAgICAgIC8vIHRpbWVcbiAgICAgICAgY2FzZSBcIkhIXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgICAgY2FzZSBcIkhcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICAgIGNhc2UgXCJoaFwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAgIGNhc2UgXCJoXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuICAgICAgICBjYXNlIFwibW1cIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgICBjYXNlIFwibVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcInFcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICAgIGNhc2UgXCJxcVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuICAgICAgICBjYXNlIFwic3NcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgICBjYXNlIFwiU1wiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZVRvVGhyZWUpO1xuICAgICAgICBjYXNlIFwiU1NTXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQodGhyZWUpO1xuICAgICAgICBjYXNlIFwidVwiOlxuICAgICAgICAgIHJldHVybiBzaW1wbGUob25lVG9OaW5lKTtcbiAgICAgICAgLy8gbWVyaWRpZW1cbiAgICAgICAgY2FzZSBcImFcIjpcbiAgICAgICAgICByZXR1cm4gb25lT2YobG9jLm1lcmlkaWVtcygpLCAwKTtcbiAgICAgICAgLy8gd2Vla1llYXIgKGspXG4gICAgICAgIGNhc2UgXCJra2trXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQoZm91cik7XG4gICAgICAgIGNhc2UgXCJra1wiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3b1RvRm91ciwgdW50cnVuY2F0ZVllYXIpO1xuICAgICAgICAvLyB3ZWVrTnVtYmVyIChXKVxuICAgICAgICBjYXNlIFwiV1wiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcIldXXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgICAgLy8gd2Vla2RheXNcbiAgICAgICAgY2FzZSBcIkVcIjpcbiAgICAgICAgY2FzZSBcImNcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmUpO1xuICAgICAgICBjYXNlIFwiRUVFXCI6XG4gICAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy53ZWVrZGF5cyhcInNob3J0XCIsIGZhbHNlLCBmYWxzZSksIDEpO1xuICAgICAgICBjYXNlIFwiRUVFRVwiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoXCJsb25nXCIsIGZhbHNlLCBmYWxzZSksIDEpO1xuICAgICAgICBjYXNlIFwiY2NjXCI6XG4gICAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy53ZWVrZGF5cyhcInNob3J0XCIsIHRydWUsIGZhbHNlKSwgMSk7XG4gICAgICAgIGNhc2UgXCJjY2NjXCI6XG4gICAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy53ZWVrZGF5cyhcImxvbmdcIiwgdHJ1ZSwgZmFsc2UpLCAxKTtcbiAgICAgICAgLy8gb2Zmc2V0L3pvbmVcbiAgICAgICAgY2FzZSBcIlpcIjpcbiAgICAgICAgY2FzZSBcIlpaXCI6XG4gICAgICAgICAgcmV0dXJuIG9mZnNldChuZXcgUmVnRXhwKGAoWystXSR7b25lT3JUd28uc291cmNlfSkoPzo6KCR7dHdvLnNvdXJjZX0pKT9gKSwgMik7XG4gICAgICAgIGNhc2UgXCJaWlpcIjpcbiAgICAgICAgICByZXR1cm4gb2Zmc2V0KG5ldyBSZWdFeHAoYChbKy1dJHtvbmVPclR3by5zb3VyY2V9KSgke3R3by5zb3VyY2V9KT9gKSwgMik7XG4gICAgICAgIC8vIHdlIGRvbid0IHN1cHBvcnQgWlpaWiAoUFNUKSBvciBaWlpaWiAoUGFjaWZpYyBTdGFuZGFyZCBUaW1lKSBpbiBwYXJzaW5nXG4gICAgICAgIC8vIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhbnkgd2F5IHRvIGZpZ3VyZSBvdXQgd2hhdCB0aGV5IGFyZVxuICAgICAgICBjYXNlIFwielwiOlxuICAgICAgICAgIHJldHVybiBzaW1wbGUoL1thLXpfKy0vXXsxLDI1Nn0/L2kpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBsaXRlcmFsKHQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgY29uc3QgdW5pdCA9IHVuaXRhdGUodG9rZW4pIHx8IHtcbiAgICBpbnZhbGlkUmVhc29uOiBNSVNTSU5HX0ZUUCxcbiAgfTtcblxuICB1bml0LnRva2VuID0gdG9rZW47XG5cbiAgcmV0dXJuIHVuaXQ7XG59XG5cbmNvbnN0IHBhcnRUeXBlU3R5bGVUb1Rva2VuVmFsID0ge1xuICB5ZWFyOiB7XG4gICAgXCIyLWRpZ2l0XCI6IFwieXlcIixcbiAgICBudW1lcmljOiBcInl5eXl5XCIsXG4gIH0sXG4gIG1vbnRoOiB7XG4gICAgbnVtZXJpYzogXCJNXCIsXG4gICAgXCIyLWRpZ2l0XCI6IFwiTU1cIixcbiAgICBzaG9ydDogXCJNTU1cIixcbiAgICBsb25nOiBcIk1NTU1cIixcbiAgfSxcbiAgZGF5OiB7XG4gICAgbnVtZXJpYzogXCJkXCIsXG4gICAgXCIyLWRpZ2l0XCI6IFwiZGRcIixcbiAgfSxcbiAgd2Vla2RheToge1xuICAgIHNob3J0OiBcIkVFRVwiLFxuICAgIGxvbmc6IFwiRUVFRVwiLFxuICB9LFxuICBkYXlwZXJpb2Q6IFwiYVwiLFxuICBkYXlQZXJpb2Q6IFwiYVwiLFxuICBob3VyOiB7XG4gICAgbnVtZXJpYzogXCJoXCIsXG4gICAgXCIyLWRpZ2l0XCI6IFwiaGhcIixcbiAgfSxcbiAgbWludXRlOiB7XG4gICAgbnVtZXJpYzogXCJtXCIsXG4gICAgXCIyLWRpZ2l0XCI6IFwibW1cIixcbiAgfSxcbiAgc2Vjb25kOiB7XG4gICAgbnVtZXJpYzogXCJzXCIsXG4gICAgXCIyLWRpZ2l0XCI6IFwic3NcIixcbiAgfSxcbn07XG5cbmZ1bmN0aW9uIHRva2VuRm9yUGFydChwYXJ0LCBsb2NhbGUsIGZvcm1hdE9wdHMpIHtcbiAgY29uc3QgeyB0eXBlLCB2YWx1ZSB9ID0gcGFydDtcblxuICBpZiAodHlwZSA9PT0gXCJsaXRlcmFsXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGl0ZXJhbDogdHJ1ZSxcbiAgICAgIHZhbDogdmFsdWUsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHN0eWxlID0gZm9ybWF0T3B0c1t0eXBlXTtcblxuICBsZXQgdmFsID0gcGFydFR5cGVTdHlsZVRvVG9rZW5WYWxbdHlwZV07XG4gIGlmICh0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiKSB7XG4gICAgdmFsID0gdmFsW3N0eWxlXTtcbiAgfVxuXG4gIGlmICh2YWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGl0ZXJhbDogZmFsc2UsXG4gICAgICB2YWwsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVnZXgodW5pdHMpIHtcbiAgY29uc3QgcmUgPSB1bml0cy5tYXAoKHUpID0+IHUucmVnZXgpLnJlZHVjZSgoZiwgcikgPT4gYCR7Zn0oJHtyLnNvdXJjZX0pYCwgXCJcIik7XG4gIHJldHVybiBbYF4ke3JlfSRgLCB1bml0c107XG59XG5cbmZ1bmN0aW9uIG1hdGNoKGlucHV0LCByZWdleCwgaGFuZGxlcnMpIHtcbiAgY29uc3QgbWF0Y2hlcyA9IGlucHV0Lm1hdGNoKHJlZ2V4KTtcblxuICBpZiAobWF0Y2hlcykge1xuICAgIGNvbnN0IGFsbCA9IHt9O1xuICAgIGxldCBtYXRjaEluZGV4ID0gMTtcbiAgICBmb3IgKGNvbnN0IGkgaW4gaGFuZGxlcnMpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eShoYW5kbGVycywgaSkpIHtcbiAgICAgICAgY29uc3QgaCA9IGhhbmRsZXJzW2ldLFxuICAgICAgICAgIGdyb3VwcyA9IGguZ3JvdXBzID8gaC5ncm91cHMgKyAxIDogMTtcbiAgICAgICAgaWYgKCFoLmxpdGVyYWwgJiYgaC50b2tlbikge1xuICAgICAgICAgIGFsbFtoLnRva2VuLnZhbFswXV0gPSBoLmRlc2VyKG1hdGNoZXMuc2xpY2UobWF0Y2hJbmRleCwgbWF0Y2hJbmRleCArIGdyb3VwcykpO1xuICAgICAgICB9XG4gICAgICAgIG1hdGNoSW5kZXggKz0gZ3JvdXBzO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW21hdGNoZXMsIGFsbF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFttYXRjaGVzLCB7fV07XG4gIH1cbn1cblxuZnVuY3Rpb24gZGF0ZVRpbWVGcm9tTWF0Y2hlcyhtYXRjaGVzKSB7XG4gIGNvbnN0IHRvRmllbGQgPSAodG9rZW4pID0+IHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiU1wiOlxuICAgICAgICByZXR1cm4gXCJtaWxsaXNlY29uZFwiO1xuICAgICAgY2FzZSBcInNcIjpcbiAgICAgICAgcmV0dXJuIFwic2Vjb25kXCI7XG4gICAgICBjYXNlIFwibVwiOlxuICAgICAgICByZXR1cm4gXCJtaW51dGVcIjtcbiAgICAgIGNhc2UgXCJoXCI6XG4gICAgICBjYXNlIFwiSFwiOlxuICAgICAgICByZXR1cm4gXCJob3VyXCI7XG4gICAgICBjYXNlIFwiZFwiOlxuICAgICAgICByZXR1cm4gXCJkYXlcIjtcbiAgICAgIGNhc2UgXCJvXCI6XG4gICAgICAgIHJldHVybiBcIm9yZGluYWxcIjtcbiAgICAgIGNhc2UgXCJMXCI6XG4gICAgICBjYXNlIFwiTVwiOlxuICAgICAgICByZXR1cm4gXCJtb250aFwiO1xuICAgICAgY2FzZSBcInlcIjpcbiAgICAgICAgcmV0dXJuIFwieWVhclwiO1xuICAgICAgY2FzZSBcIkVcIjpcbiAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgIHJldHVybiBcIndlZWtkYXlcIjtcbiAgICAgIGNhc2UgXCJXXCI6XG4gICAgICAgIHJldHVybiBcIndlZWtOdW1iZXJcIjtcbiAgICAgIGNhc2UgXCJrXCI6XG4gICAgICAgIHJldHVybiBcIndlZWtZZWFyXCI7XG4gICAgICBjYXNlIFwicVwiOlxuICAgICAgICByZXR1cm4gXCJxdWFydGVyXCI7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgbGV0IHpvbmU7XG4gIGlmICghaXNVbmRlZmluZWQobWF0Y2hlcy5aKSkge1xuICAgIHpvbmUgPSBuZXcgRml4ZWRPZmZzZXRab25lKG1hdGNoZXMuWik7XG4gIH0gZWxzZSBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMueikpIHtcbiAgICB6b25lID0gSUFOQVpvbmUuY3JlYXRlKG1hdGNoZXMueik7XG4gIH0gZWxzZSB7XG4gICAgem9uZSA9IG51bGw7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMucSkpIHtcbiAgICBtYXRjaGVzLk0gPSAobWF0Y2hlcy5xIC0gMSkgKiAzICsgMTtcbiAgfVxuXG4gIGlmICghaXNVbmRlZmluZWQobWF0Y2hlcy5oKSkge1xuICAgIGlmIChtYXRjaGVzLmggPCAxMiAmJiBtYXRjaGVzLmEgPT09IDEpIHtcbiAgICAgIG1hdGNoZXMuaCArPSAxMjtcbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMuaCA9PT0gMTIgJiYgbWF0Y2hlcy5hID09PSAwKSB7XG4gICAgICBtYXRjaGVzLmggPSAwO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtYXRjaGVzLkcgPT09IDAgJiYgbWF0Y2hlcy55KSB7XG4gICAgbWF0Y2hlcy55ID0gLW1hdGNoZXMueTtcbiAgfVxuXG4gIGlmICghaXNVbmRlZmluZWQobWF0Y2hlcy51KSkge1xuICAgIG1hdGNoZXMuUyA9IHBhcnNlTWlsbGlzKG1hdGNoZXMudSk7XG4gIH1cblxuICBjb25zdCB2YWxzID0gT2JqZWN0LmtleXMobWF0Y2hlcykucmVkdWNlKChyLCBrKSA9PiB7XG4gICAgY29uc3QgZiA9IHRvRmllbGQoayk7XG4gICAgaWYgKGYpIHtcbiAgICAgIHJbZl0gPSBtYXRjaGVzW2tdO1xuICAgIH1cblxuICAgIHJldHVybiByO1xuICB9LCB7fSk7XG5cbiAgcmV0dXJuIFt2YWxzLCB6b25lXTtcbn1cblxubGV0IGR1bW15RGF0ZVRpbWVDYWNoZSA9IG51bGw7XG5cbmZ1bmN0aW9uIGdldER1bW15RGF0ZVRpbWUoKSB7XG4gIGlmICghZHVtbXlEYXRlVGltZUNhY2hlKSB7XG4gICAgZHVtbXlEYXRlVGltZUNhY2hlID0gRGF0ZVRpbWUuZnJvbU1pbGxpcygxNTU1NTU1NTU1NTU1KTtcbiAgfVxuXG4gIHJldHVybiBkdW1teURhdGVUaW1lQ2FjaGU7XG59XG5cbmZ1bmN0aW9uIG1heWJlRXhwYW5kTWFjcm9Ub2tlbih0b2tlbiwgbG9jYWxlKSB7XG4gIGlmICh0b2tlbi5saXRlcmFsKSB7XG4gICAgcmV0dXJuIHRva2VuO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0T3B0cyA9IEZvcm1hdHRlci5tYWNyb1Rva2VuVG9Gb3JtYXRPcHRzKHRva2VuLnZhbCk7XG5cbiAgaWYgKCFmb3JtYXRPcHRzKSB7XG4gICAgcmV0dXJuIHRva2VuO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0dGVyID0gRm9ybWF0dGVyLmNyZWF0ZShsb2NhbGUsIGZvcm1hdE9wdHMpO1xuICBjb25zdCBwYXJ0cyA9IGZvcm1hdHRlci5mb3JtYXREYXRlVGltZVBhcnRzKGdldER1bW15RGF0ZVRpbWUoKSk7XG5cbiAgY29uc3QgdG9rZW5zID0gcGFydHMubWFwKChwKSA9PiB0b2tlbkZvclBhcnQocCwgbG9jYWxlLCBmb3JtYXRPcHRzKSk7XG5cbiAgaWYgKHRva2Vucy5pbmNsdWRlcyh1bmRlZmluZWQpKSB7XG4gICAgcmV0dXJuIHRva2VuO1xuICB9XG5cbiAgcmV0dXJuIHRva2Vucztcbn1cblxuZnVuY3Rpb24gZXhwYW5kTWFjcm9Ub2tlbnModG9rZW5zLCBsb2NhbGUpIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQoLi4udG9rZW5zLm1hcCgodCkgPT4gbWF5YmVFeHBhbmRNYWNyb1Rva2VuKHQsIGxvY2FsZSkpKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleHBsYWluRnJvbVRva2Vucyhsb2NhbGUsIGlucHV0LCBmb3JtYXQpIHtcbiAgY29uc3QgdG9rZW5zID0gZXhwYW5kTWFjcm9Ub2tlbnMoRm9ybWF0dGVyLnBhcnNlRm9ybWF0KGZvcm1hdCksIGxvY2FsZSksXG4gICAgdW5pdHMgPSB0b2tlbnMubWFwKCh0KSA9PiB1bml0Rm9yVG9rZW4odCwgbG9jYWxlKSksXG4gICAgZGlzcXVhbGlmeWluZ1VuaXQgPSB1bml0cy5maW5kKCh0KSA9PiB0LmludmFsaWRSZWFzb24pO1xuXG4gIGlmIChkaXNxdWFsaWZ5aW5nVW5pdCkge1xuICAgIHJldHVybiB7IGlucHV0LCB0b2tlbnMsIGludmFsaWRSZWFzb246IGRpc3F1YWxpZnlpbmdVbml0LmludmFsaWRSZWFzb24gfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbcmVnZXhTdHJpbmcsIGhhbmRsZXJzXSA9IGJ1aWxkUmVnZXgodW5pdHMpLFxuICAgICAgcmVnZXggPSBSZWdFeHAocmVnZXhTdHJpbmcsIFwiaVwiKSxcbiAgICAgIFtyYXdNYXRjaGVzLCBtYXRjaGVzXSA9IG1hdGNoKGlucHV0LCByZWdleCwgaGFuZGxlcnMpLFxuICAgICAgW3Jlc3VsdCwgem9uZV0gPSBtYXRjaGVzID8gZGF0ZVRpbWVGcm9tTWF0Y2hlcyhtYXRjaGVzKSA6IFtudWxsLCBudWxsXTtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkobWF0Y2hlcywgXCJhXCIpICYmIGhhc093blByb3BlcnR5KG1hdGNoZXMsIFwiSFwiKSkge1xuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yKFxuICAgICAgICBcIkNhbid0IGluY2x1ZGUgbWVyaWRpZW0gd2hlbiBzcGVjaWZ5aW5nIDI0LWhvdXIgZm9ybWF0XCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7IGlucHV0LCB0b2tlbnMsIHJlZ2V4LCByYXdNYXRjaGVzLCBtYXRjaGVzLCByZXN1bHQsIHpvbmUgfTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCkge1xuICBjb25zdCB7IHJlc3VsdCwgem9uZSwgaW52YWxpZFJlYXNvbiB9ID0gZXhwbGFpbkZyb21Ub2tlbnMobG9jYWxlLCBpbnB1dCwgZm9ybWF0KTtcbiAgcmV0dXJuIFtyZXN1bHQsIHpvbmUsIGludmFsaWRSZWFzb25dO1xufVxuIiwgImltcG9ydCB7XG4gIGludGVnZXJCZXR3ZWVuLFxuICBpc0xlYXBZZWFyLFxuICB0aW1lT2JqZWN0LFxuICBkYXlzSW5ZZWFyLFxuICBkYXlzSW5Nb250aCxcbiAgd2Vla3NJbldlZWtZZWFyLFxuICBpc0ludGVnZXIsXG59IGZyb20gXCIuL3V0aWwuanNcIjtcbmltcG9ydCBJbnZhbGlkIGZyb20gXCIuL2ludmFsaWQuanNcIjtcblxuY29uc3Qgbm9uTGVhcExhZGRlciA9IFswLCAzMSwgNTksIDkwLCAxMjAsIDE1MSwgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNF0sXG4gIGxlYXBMYWRkZXIgPSBbMCwgMzEsIDYwLCA5MSwgMTIxLCAxNTIsIDE4MiwgMjEzLCAyNDQsIDI3NCwgMzA1LCAzMzVdO1xuXG5mdW5jdGlvbiB1bml0T3V0T2ZSYW5nZSh1bml0LCB2YWx1ZSkge1xuICByZXR1cm4gbmV3IEludmFsaWQoXG4gICAgXCJ1bml0IG91dCBvZiByYW5nZVwiLFxuICAgIGB5b3Ugc3BlY2lmaWVkICR7dmFsdWV9IChvZiB0eXBlICR7dHlwZW9mIHZhbHVlfSkgYXMgYSAke3VuaXR9LCB3aGljaCBpcyBpbnZhbGlkYFxuICApO1xufVxuXG5mdW5jdGlvbiBkYXlPZldlZWsoeWVhciwgbW9udGgsIGRheSkge1xuICBjb25zdCBqcyA9IG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoIC0gMSwgZGF5KSkuZ2V0VVRDRGF5KCk7XG4gIHJldHVybiBqcyA9PT0gMCA/IDcgOiBqcztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZU9yZGluYWwoeWVhciwgbW9udGgsIGRheSkge1xuICByZXR1cm4gZGF5ICsgKGlzTGVhcFllYXIoeWVhcikgPyBsZWFwTGFkZGVyIDogbm9uTGVhcExhZGRlcilbbW9udGggLSAxXTtcbn1cblxuZnVuY3Rpb24gdW5jb21wdXRlT3JkaW5hbCh5ZWFyLCBvcmRpbmFsKSB7XG4gIGNvbnN0IHRhYmxlID0gaXNMZWFwWWVhcih5ZWFyKSA/IGxlYXBMYWRkZXIgOiBub25MZWFwTGFkZGVyLFxuICAgIG1vbnRoMCA9IHRhYmxlLmZpbmRJbmRleCgoaSkgPT4gaSA8IG9yZGluYWwpLFxuICAgIGRheSA9IG9yZGluYWwgLSB0YWJsZVttb250aDBdO1xuICByZXR1cm4geyBtb250aDogbW9udGgwICsgMSwgZGF5IH07XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ3JlZ29yaWFuVG9XZWVrKGdyZWdPYmopIHtcbiAgY29uc3QgeyB5ZWFyLCBtb250aCwgZGF5IH0gPSBncmVnT2JqLFxuICAgIG9yZGluYWwgPSBjb21wdXRlT3JkaW5hbCh5ZWFyLCBtb250aCwgZGF5KSxcbiAgICB3ZWVrZGF5ID0gZGF5T2ZXZWVrKHllYXIsIG1vbnRoLCBkYXkpO1xuXG4gIGxldCB3ZWVrTnVtYmVyID0gTWF0aC5mbG9vcigob3JkaW5hbCAtIHdlZWtkYXkgKyAxMCkgLyA3KSxcbiAgICB3ZWVrWWVhcjtcblxuICBpZiAod2Vla051bWJlciA8IDEpIHtcbiAgICB3ZWVrWWVhciA9IHllYXIgLSAxO1xuICAgIHdlZWtOdW1iZXIgPSB3ZWVrc0luV2Vla1llYXIod2Vla1llYXIpO1xuICB9IGVsc2UgaWYgKHdlZWtOdW1iZXIgPiB3ZWVrc0luV2Vla1llYXIoeWVhcikpIHtcbiAgICB3ZWVrWWVhciA9IHllYXIgKyAxO1xuICAgIHdlZWtOdW1iZXIgPSAxO1xuICB9IGVsc2Uge1xuICAgIHdlZWtZZWFyID0geWVhcjtcbiAgfVxuXG4gIHJldHVybiB7IHdlZWtZZWFyLCB3ZWVrTnVtYmVyLCB3ZWVrZGF5LCAuLi50aW1lT2JqZWN0KGdyZWdPYmopIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3ZWVrVG9HcmVnb3JpYW4od2Vla0RhdGEpIHtcbiAgY29uc3QgeyB3ZWVrWWVhciwgd2Vla051bWJlciwgd2Vla2RheSB9ID0gd2Vla0RhdGEsXG4gICAgd2Vla2RheU9mSmFuNCA9IGRheU9mV2Vlayh3ZWVrWWVhciwgMSwgNCksXG4gICAgeWVhckluRGF5cyA9IGRheXNJblllYXIod2Vla1llYXIpO1xuXG4gIGxldCBvcmRpbmFsID0gd2Vla051bWJlciAqIDcgKyB3ZWVrZGF5IC0gd2Vla2RheU9mSmFuNCAtIDMsXG4gICAgeWVhcjtcblxuICBpZiAob3JkaW5hbCA8IDEpIHtcbiAgICB5ZWFyID0gd2Vla1llYXIgLSAxO1xuICAgIG9yZGluYWwgKz0gZGF5c0luWWVhcih5ZWFyKTtcbiAgfSBlbHNlIGlmIChvcmRpbmFsID4geWVhckluRGF5cykge1xuICAgIHllYXIgPSB3ZWVrWWVhciArIDE7XG4gICAgb3JkaW5hbCAtPSBkYXlzSW5ZZWFyKHdlZWtZZWFyKTtcbiAgfSBlbHNlIHtcbiAgICB5ZWFyID0gd2Vla1llYXI7XG4gIH1cblxuICBjb25zdCB7IG1vbnRoLCBkYXkgfSA9IHVuY29tcHV0ZU9yZGluYWwoeWVhciwgb3JkaW5hbCk7XG4gIHJldHVybiB7IHllYXIsIG1vbnRoLCBkYXksIC4uLnRpbWVPYmplY3Qod2Vla0RhdGEpIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBncmVnb3JpYW5Ub09yZGluYWwoZ3JlZ0RhdGEpIHtcbiAgY29uc3QgeyB5ZWFyLCBtb250aCwgZGF5IH0gPSBncmVnRGF0YTtcbiAgY29uc3Qgb3JkaW5hbCA9IGNvbXB1dGVPcmRpbmFsKHllYXIsIG1vbnRoLCBkYXkpO1xuICByZXR1cm4geyB5ZWFyLCBvcmRpbmFsLCAuLi50aW1lT2JqZWN0KGdyZWdEYXRhKSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3JkaW5hbFRvR3JlZ29yaWFuKG9yZGluYWxEYXRhKSB7XG4gIGNvbnN0IHsgeWVhciwgb3JkaW5hbCB9ID0gb3JkaW5hbERhdGE7XG4gIGNvbnN0IHsgbW9udGgsIGRheSB9ID0gdW5jb21wdXRlT3JkaW5hbCh5ZWFyLCBvcmRpbmFsKTtcbiAgcmV0dXJuIHsgeWVhciwgbW9udGgsIGRheSwgLi4udGltZU9iamVjdChvcmRpbmFsRGF0YSkgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0ludmFsaWRXZWVrRGF0YShvYmopIHtcbiAgY29uc3QgdmFsaWRZZWFyID0gaXNJbnRlZ2VyKG9iai53ZWVrWWVhciksXG4gICAgdmFsaWRXZWVrID0gaW50ZWdlckJldHdlZW4ob2JqLndlZWtOdW1iZXIsIDEsIHdlZWtzSW5XZWVrWWVhcihvYmoud2Vla1llYXIpKSxcbiAgICB2YWxpZFdlZWtkYXkgPSBpbnRlZ2VyQmV0d2VlbihvYmoud2Vla2RheSwgMSwgNyk7XG5cbiAgaWYgKCF2YWxpZFllYXIpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJ3ZWVrWWVhclwiLCBvYmoud2Vla1llYXIpO1xuICB9IGVsc2UgaWYgKCF2YWxpZFdlZWspIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJ3ZWVrXCIsIG9iai53ZWVrKTtcbiAgfSBlbHNlIGlmICghdmFsaWRXZWVrZGF5KSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwid2Vla2RheVwiLCBvYmoud2Vla2RheSk7XG4gIH0gZWxzZSByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNJbnZhbGlkT3JkaW5hbERhdGEob2JqKSB7XG4gIGNvbnN0IHZhbGlkWWVhciA9IGlzSW50ZWdlcihvYmoueWVhciksXG4gICAgdmFsaWRPcmRpbmFsID0gaW50ZWdlckJldHdlZW4ob2JqLm9yZGluYWwsIDEsIGRheXNJblllYXIob2JqLnllYXIpKTtcblxuICBpZiAoIXZhbGlkWWVhcikge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcInllYXJcIiwgb2JqLnllYXIpO1xuICB9IGVsc2UgaWYgKCF2YWxpZE9yZGluYWwpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJvcmRpbmFsXCIsIG9iai5vcmRpbmFsKTtcbiAgfSBlbHNlIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0ludmFsaWRHcmVnb3JpYW5EYXRhKG9iaikge1xuICBjb25zdCB2YWxpZFllYXIgPSBpc0ludGVnZXIob2JqLnllYXIpLFxuICAgIHZhbGlkTW9udGggPSBpbnRlZ2VyQmV0d2VlbihvYmoubW9udGgsIDEsIDEyKSxcbiAgICB2YWxpZERheSA9IGludGVnZXJCZXR3ZWVuKG9iai5kYXksIDEsIGRheXNJbk1vbnRoKG9iai55ZWFyLCBvYmoubW9udGgpKTtcblxuICBpZiAoIXZhbGlkWWVhcikge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcInllYXJcIiwgb2JqLnllYXIpO1xuICB9IGVsc2UgaWYgKCF2YWxpZE1vbnRoKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwibW9udGhcIiwgb2JqLm1vbnRoKTtcbiAgfSBlbHNlIGlmICghdmFsaWREYXkpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJkYXlcIiwgb2JqLmRheSk7XG4gIH0gZWxzZSByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNJbnZhbGlkVGltZURhdGEob2JqKSB7XG4gIGNvbnN0IHsgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kIH0gPSBvYmo7XG4gIGNvbnN0IHZhbGlkSG91ciA9XG4gICAgICBpbnRlZ2VyQmV0d2Vlbihob3VyLCAwLCAyMykgfHxcbiAgICAgIChob3VyID09PSAyNCAmJiBtaW51dGUgPT09IDAgJiYgc2Vjb25kID09PSAwICYmIG1pbGxpc2Vjb25kID09PSAwKSxcbiAgICB2YWxpZE1pbnV0ZSA9IGludGVnZXJCZXR3ZWVuKG1pbnV0ZSwgMCwgNTkpLFxuICAgIHZhbGlkU2Vjb25kID0gaW50ZWdlckJldHdlZW4oc2Vjb25kLCAwLCA1OSksXG4gICAgdmFsaWRNaWxsaXNlY29uZCA9IGludGVnZXJCZXR3ZWVuKG1pbGxpc2Vjb25kLCAwLCA5OTkpO1xuXG4gIGlmICghdmFsaWRIb3VyKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwiaG91clwiLCBob3VyKTtcbiAgfSBlbHNlIGlmICghdmFsaWRNaW51dGUpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJtaW51dGVcIiwgbWludXRlKTtcbiAgfSBlbHNlIGlmICghdmFsaWRTZWNvbmQpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJzZWNvbmRcIiwgc2Vjb25kKTtcbiAgfSBlbHNlIGlmICghdmFsaWRNaWxsaXNlY29uZCkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIm1pbGxpc2Vjb25kXCIsIG1pbGxpc2Vjb25kKTtcbiAgfSBlbHNlIHJldHVybiBmYWxzZTtcbn1cbiIsICJpbXBvcnQgRHVyYXRpb24sIHsgZnJpZW5kbHlEdXJhdGlvbiB9IGZyb20gXCIuL2R1cmF0aW9uLmpzXCI7XG5pbXBvcnQgSW50ZXJ2YWwgZnJvbSBcIi4vaW50ZXJ2YWwuanNcIjtcbmltcG9ydCBTZXR0aW5ncyBmcm9tIFwiLi9zZXR0aW5ncy5qc1wiO1xuaW1wb3J0IEluZm8gZnJvbSBcIi4vaW5mby5qc1wiO1xuaW1wb3J0IEZvcm1hdHRlciBmcm9tIFwiLi9pbXBsL2Zvcm1hdHRlci5qc1wiO1xuaW1wb3J0IEZpeGVkT2Zmc2V0Wm9uZSBmcm9tIFwiLi96b25lcy9maXhlZE9mZnNldFpvbmUuanNcIjtcbmltcG9ydCBMb2NhbGUgZnJvbSBcIi4vaW1wbC9sb2NhbGUuanNcIjtcbmltcG9ydCB7XG4gIGlzVW5kZWZpbmVkLFxuICBtYXliZUFycmF5LFxuICBpc0RhdGUsXG4gIGlzTnVtYmVyLFxuICBiZXN0QnksXG4gIGRheXNJbk1vbnRoLFxuICBkYXlzSW5ZZWFyLFxuICBpc0xlYXBZZWFyLFxuICB3ZWVrc0luV2Vla1llYXIsXG4gIG5vcm1hbGl6ZU9iamVjdCxcbiAgcm91bmRUbyxcbiAgb2JqVG9Mb2NhbFRTLFxufSBmcm9tIFwiLi9pbXBsL3V0aWwuanNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZVpvbmUgfSBmcm9tIFwiLi9pbXBsL3pvbmVVdGlsLmpzXCI7XG5pbXBvcnQgZGlmZiBmcm9tIFwiLi9pbXBsL2RpZmYuanNcIjtcbmltcG9ydCB7IHBhcnNlUkZDMjgyMkRhdGUsIHBhcnNlSVNPRGF0ZSwgcGFyc2VIVFRQRGF0ZSwgcGFyc2VTUUwgfSBmcm9tIFwiLi9pbXBsL3JlZ2V4UGFyc2VyLmpzXCI7XG5pbXBvcnQgeyBwYXJzZUZyb21Ub2tlbnMsIGV4cGxhaW5Gcm9tVG9rZW5zIH0gZnJvbSBcIi4vaW1wbC90b2tlblBhcnNlci5qc1wiO1xuaW1wb3J0IHtcbiAgZ3JlZ29yaWFuVG9XZWVrLFxuICB3ZWVrVG9HcmVnb3JpYW4sXG4gIGdyZWdvcmlhblRvT3JkaW5hbCxcbiAgb3JkaW5hbFRvR3JlZ29yaWFuLFxuICBoYXNJbnZhbGlkR3JlZ29yaWFuRGF0YSxcbiAgaGFzSW52YWxpZFdlZWtEYXRhLFxuICBoYXNJbnZhbGlkT3JkaW5hbERhdGEsXG4gIGhhc0ludmFsaWRUaW1lRGF0YSxcbn0gZnJvbSBcIi4vaW1wbC9jb252ZXJzaW9ucy5qc1wiO1xuaW1wb3J0ICogYXMgRm9ybWF0cyBmcm9tIFwiLi9pbXBsL2Zvcm1hdHMuanNcIjtcbmltcG9ydCB7XG4gIEludmFsaWRBcmd1bWVudEVycm9yLFxuICBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcixcbiAgSW52YWxpZFVuaXRFcnJvcixcbiAgSW52YWxpZERhdGVUaW1lRXJyb3IsXG59IGZyb20gXCIuL2Vycm9ycy5qc1wiO1xuaW1wb3J0IEludmFsaWQgZnJvbSBcIi4vaW1wbC9pbnZhbGlkLmpzXCI7XG5cbmNvbnN0IElOVkFMSUQgPSBcIkludmFsaWQgRGF0ZVRpbWVcIjtcbmNvbnN0IE1BWF9EQVRFID0gOC42NGUxNTtcblxuZnVuY3Rpb24gdW5zdXBwb3J0ZWRab25lKHpvbmUpIHtcbiAgcmV0dXJuIG5ldyBJbnZhbGlkKFwidW5zdXBwb3J0ZWQgem9uZVwiLCBgdGhlIHpvbmUgXCIke3pvbmUubmFtZX1cIiBpcyBub3Qgc3VwcG9ydGVkYCk7XG59XG5cbi8vIHdlIGNhY2hlIHdlZWsgZGF0YSBvbiB0aGUgRFQgb2JqZWN0IGFuZCB0aGlzIGludGVybWVkaWF0ZXMgdGhlIGNhY2hlXG5mdW5jdGlvbiBwb3NzaWJseUNhY2hlZFdlZWtEYXRhKGR0KSB7XG4gIGlmIChkdC53ZWVrRGF0YSA9PT0gbnVsbCkge1xuICAgIGR0LndlZWtEYXRhID0gZ3JlZ29yaWFuVG9XZWVrKGR0LmMpO1xuICB9XG4gIHJldHVybiBkdC53ZWVrRGF0YTtcbn1cblxuLy8gY2xvbmUgcmVhbGx5IG1lYW5zLCBcIm1ha2UgYSBuZXcgb2JqZWN0IHdpdGggdGhlc2UgbW9kaWZpY2F0aW9uc1wiLiBhbGwgXCJzZXR0ZXJzXCIgcmVhbGx5IHVzZSB0aGlzXG4vLyB0byBjcmVhdGUgYSBuZXcgb2JqZWN0IHdoaWxlIG9ubHkgY2hhbmdpbmcgc29tZSBvZiB0aGUgcHJvcGVydGllc1xuZnVuY3Rpb24gY2xvbmUoaW5zdCwgYWx0cykge1xuICBjb25zdCBjdXJyZW50ID0ge1xuICAgIHRzOiBpbnN0LnRzLFxuICAgIHpvbmU6IGluc3Quem9uZSxcbiAgICBjOiBpbnN0LmMsXG4gICAgbzogaW5zdC5vLFxuICAgIGxvYzogaW5zdC5sb2MsXG4gICAgaW52YWxpZDogaW5zdC5pbnZhbGlkLFxuICB9O1xuICByZXR1cm4gbmV3IERhdGVUaW1lKHsgLi4uY3VycmVudCwgLi4uYWx0cywgb2xkOiBjdXJyZW50IH0pO1xufVxuXG4vLyBmaW5kIHRoZSByaWdodCBvZmZzZXQgYSBnaXZlbiBsb2NhbCB0aW1lLiBUaGUgbyBpbnB1dCBpcyBvdXIgZ3Vlc3MsIHdoaWNoIGRldGVybWluZXMgd2hpY2hcbi8vIG9mZnNldCB3ZSdsbCBwaWNrIGluIGFtYmlndW91cyBjYXNlcyAoZS5nLiB0aGVyZSBhcmUgdHdvIDMgQU1zIGIvYyBGYWxsYmFjayBEU1QpXG5mdW5jdGlvbiBmaXhPZmZzZXQobG9jYWxUUywgbywgdHopIHtcbiAgLy8gT3VyIFVUQyB0aW1lIGlzIGp1c3QgYSBndWVzcyBiZWNhdXNlIG91ciBvZmZzZXQgaXMganVzdCBhIGd1ZXNzXG4gIGxldCB1dGNHdWVzcyA9IGxvY2FsVFMgLSBvICogNjAgKiAxMDAwO1xuXG4gIC8vIFRlc3Qgd2hldGhlciB0aGUgem9uZSBtYXRjaGVzIHRoZSBvZmZzZXQgZm9yIHRoaXMgdHNcbiAgY29uc3QgbzIgPSB0ei5vZmZzZXQodXRjR3Vlc3MpO1xuXG4gIC8vIElmIHNvLCBvZmZzZXQgZGlkbid0IGNoYW5nZSBhbmQgd2UncmUgZG9uZVxuICBpZiAobyA9PT0gbzIpIHtcbiAgICByZXR1cm4gW3V0Y0d1ZXNzLCBvXTtcbiAgfVxuXG4gIC8vIElmIG5vdCwgY2hhbmdlIHRoZSB0cyBieSB0aGUgZGlmZmVyZW5jZSBpbiB0aGUgb2Zmc2V0XG4gIHV0Y0d1ZXNzIC09IChvMiAtIG8pICogNjAgKiAxMDAwO1xuXG4gIC8vIElmIHRoYXQgZ2l2ZXMgdXMgdGhlIGxvY2FsIHRpbWUgd2Ugd2FudCwgd2UncmUgZG9uZVxuICBjb25zdCBvMyA9IHR6Lm9mZnNldCh1dGNHdWVzcyk7XG4gIGlmIChvMiA9PT0gbzMpIHtcbiAgICByZXR1cm4gW3V0Y0d1ZXNzLCBvMl07XG4gIH1cblxuICAvLyBJZiBpdCdzIGRpZmZlcmVudCwgd2UncmUgaW4gYSBob2xlIHRpbWUuIFRoZSBvZmZzZXQgaGFzIGNoYW5nZWQsIGJ1dCB0aGUgd2UgZG9uJ3QgYWRqdXN0IHRoZSB0aW1lXG4gIHJldHVybiBbbG9jYWxUUyAtIE1hdGgubWluKG8yLCBvMykgKiA2MCAqIDEwMDAsIE1hdGgubWF4KG8yLCBvMyldO1xufVxuXG4vLyBjb252ZXJ0IGFuIGVwb2NoIHRpbWVzdGFtcCBpbnRvIGEgY2FsZW5kYXIgb2JqZWN0IHdpdGggdGhlIGdpdmVuIG9mZnNldFxuZnVuY3Rpb24gdHNUb09iaih0cywgb2Zmc2V0KSB7XG4gIHRzICs9IG9mZnNldCAqIDYwICogMTAwMDtcblxuICBjb25zdCBkID0gbmV3IERhdGUodHMpO1xuXG4gIHJldHVybiB7XG4gICAgeWVhcjogZC5nZXRVVENGdWxsWWVhcigpLFxuICAgIG1vbnRoOiBkLmdldFVUQ01vbnRoKCkgKyAxLFxuICAgIGRheTogZC5nZXRVVENEYXRlKCksXG4gICAgaG91cjogZC5nZXRVVENIb3VycygpLFxuICAgIG1pbnV0ZTogZC5nZXRVVENNaW51dGVzKCksXG4gICAgc2Vjb25kOiBkLmdldFVUQ1NlY29uZHMoKSxcbiAgICBtaWxsaXNlY29uZDogZC5nZXRVVENNaWxsaXNlY29uZHMoKSxcbiAgfTtcbn1cblxuLy8gY29udmVydCBhIGNhbGVuZGFyIG9iamVjdCB0byBhIGVwb2NoIHRpbWVzdGFtcFxuZnVuY3Rpb24gb2JqVG9UUyhvYmosIG9mZnNldCwgem9uZSkge1xuICByZXR1cm4gZml4T2Zmc2V0KG9ialRvTG9jYWxUUyhvYmopLCBvZmZzZXQsIHpvbmUpO1xufVxuXG4vLyBjcmVhdGUgYSBuZXcgRFQgaW5zdGFuY2UgYnkgYWRkaW5nIGEgZHVyYXRpb24sIGFkanVzdGluZyBmb3IgRFNUc1xuZnVuY3Rpb24gYWRqdXN0VGltZShpbnN0LCBkdXIpIHtcbiAgY29uc3Qgb1ByZSA9IGluc3QubyxcbiAgICB5ZWFyID0gaW5zdC5jLnllYXIgKyBNYXRoLnRydW5jKGR1ci55ZWFycyksXG4gICAgbW9udGggPSBpbnN0LmMubW9udGggKyBNYXRoLnRydW5jKGR1ci5tb250aHMpICsgTWF0aC50cnVuYyhkdXIucXVhcnRlcnMpICogMyxcbiAgICBjID0ge1xuICAgICAgLi4uaW5zdC5jLFxuICAgICAgeWVhcixcbiAgICAgIG1vbnRoLFxuICAgICAgZGF5OlxuICAgICAgICBNYXRoLm1pbihpbnN0LmMuZGF5LCBkYXlzSW5Nb250aCh5ZWFyLCBtb250aCkpICtcbiAgICAgICAgTWF0aC50cnVuYyhkdXIuZGF5cykgK1xuICAgICAgICBNYXRoLnRydW5jKGR1ci53ZWVrcykgKiA3LFxuICAgIH0sXG4gICAgbWlsbGlzVG9BZGQgPSBEdXJhdGlvbi5mcm9tT2JqZWN0KHtcbiAgICAgIHllYXJzOiBkdXIueWVhcnMgLSBNYXRoLnRydW5jKGR1ci55ZWFycyksXG4gICAgICBxdWFydGVyczogZHVyLnF1YXJ0ZXJzIC0gTWF0aC50cnVuYyhkdXIucXVhcnRlcnMpLFxuICAgICAgbW9udGhzOiBkdXIubW9udGhzIC0gTWF0aC50cnVuYyhkdXIubW9udGhzKSxcbiAgICAgIHdlZWtzOiBkdXIud2Vla3MgLSBNYXRoLnRydW5jKGR1ci53ZWVrcyksXG4gICAgICBkYXlzOiBkdXIuZGF5cyAtIE1hdGgudHJ1bmMoZHVyLmRheXMpLFxuICAgICAgaG91cnM6IGR1ci5ob3VycyxcbiAgICAgIG1pbnV0ZXM6IGR1ci5taW51dGVzLFxuICAgICAgc2Vjb25kczogZHVyLnNlY29uZHMsXG4gICAgICBtaWxsaXNlY29uZHM6IGR1ci5taWxsaXNlY29uZHMsXG4gICAgfSkuYXMoXCJtaWxsaXNlY29uZHNcIiksXG4gICAgbG9jYWxUUyA9IG9ialRvTG9jYWxUUyhjKTtcblxuICBsZXQgW3RzLCBvXSA9IGZpeE9mZnNldChsb2NhbFRTLCBvUHJlLCBpbnN0LnpvbmUpO1xuXG4gIGlmIChtaWxsaXNUb0FkZCAhPT0gMCkge1xuICAgIHRzICs9IG1pbGxpc1RvQWRkO1xuICAgIC8vIHRoYXQgY291bGQgaGF2ZSBjaGFuZ2VkIHRoZSBvZmZzZXQgYnkgZ29pbmcgb3ZlciBhIERTVCwgYnV0IHdlIHdhbnQgdG8ga2VlcCB0aGUgdHMgdGhlIHNhbWVcbiAgICBvID0gaW5zdC56b25lLm9mZnNldCh0cyk7XG4gIH1cblxuICByZXR1cm4geyB0cywgbyB9O1xufVxuXG4vLyBoZWxwZXIgdXNlZnVsIGluIHR1cm5pbmcgdGhlIHJlc3VsdHMgb2YgcGFyc2luZyBpbnRvIHJlYWwgZGF0ZXNcbi8vIGJ5IGhhbmRsaW5nIHRoZSB6b25lIG9wdGlvbnNcbmZ1bmN0aW9uIHBhcnNlRGF0YVRvRGF0ZVRpbWUocGFyc2VkLCBwYXJzZWRab25lLCBvcHRzLCBmb3JtYXQsIHRleHQpIHtcbiAgY29uc3QgeyBzZXRab25lLCB6b25lIH0gPSBvcHRzO1xuICBpZiAocGFyc2VkICYmIE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoICE9PSAwKSB7XG4gICAgY29uc3QgaW50ZXJwcmV0YXRpb25ab25lID0gcGFyc2VkWm9uZSB8fCB6b25lLFxuICAgICAgaW5zdCA9IERhdGVUaW1lLmZyb21PYmplY3QocGFyc2VkLCB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIHpvbmU6IGludGVycHJldGF0aW9uWm9uZSxcbiAgICAgIH0pO1xuICAgIHJldHVybiBzZXRab25lID8gaW5zdCA6IGluc3Quc2V0Wm9uZSh6b25lKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZChcbiAgICAgIG5ldyBJbnZhbGlkKFwidW5wYXJzYWJsZVwiLCBgdGhlIGlucHV0IFwiJHt0ZXh0fVwiIGNhbid0IGJlIHBhcnNlZCBhcyAke2Zvcm1hdH1gKVxuICAgICk7XG4gIH1cbn1cblxuLy8gaWYgeW91IHdhbnQgdG8gb3V0cHV0IGEgdGVjaG5pY2FsIGZvcm1hdCAoZS5nLiBSRkMgMjgyMiksIHRoaXMgaGVscGVyXG4vLyBoZWxwcyBoYW5kbGUgdGhlIGRldGFpbHNcbmZ1bmN0aW9uIHRvVGVjaEZvcm1hdChkdCwgZm9ybWF0LCBhbGxvd1ogPSB0cnVlKSB7XG4gIHJldHVybiBkdC5pc1ZhbGlkXG4gICAgPyBGb3JtYXR0ZXIuY3JlYXRlKExvY2FsZS5jcmVhdGUoXCJlbi1VU1wiKSwge1xuICAgICAgICBhbGxvd1osXG4gICAgICAgIGZvcmNlU2ltcGxlOiB0cnVlLFxuICAgICAgfSkuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKGR0LCBmb3JtYXQpXG4gICAgOiBudWxsO1xufVxuXG4vLyB0ZWNobmljYWwgdGltZSBmb3JtYXRzIChlLmcuIHRoZSB0aW1lIHBhcnQgb2YgSVNPIDg2MDEpLCB0YWtlIHNvbWUgb3B0aW9uc1xuLy8gYW5kIHRoaXMgY29tbW9uaXplcyB0aGVpciBoYW5kbGluZ1xuZnVuY3Rpb24gdG9UZWNoVGltZUZvcm1hdChcbiAgZHQsXG4gIHtcbiAgICBzdXBwcmVzc1NlY29uZHMgPSBmYWxzZSxcbiAgICBzdXBwcmVzc01pbGxpc2Vjb25kcyA9IGZhbHNlLFxuICAgIGluY2x1ZGVPZmZzZXQsXG4gICAgaW5jbHVkZVByZWZpeCA9IGZhbHNlLFxuICAgIGluY2x1ZGVab25lID0gZmFsc2UsXG4gICAgc3BhY2Vab25lID0gZmFsc2UsXG4gICAgZm9ybWF0ID0gXCJleHRlbmRlZFwiLFxuICB9XG4pIHtcbiAgbGV0IGZtdCA9IGZvcm1hdCA9PT0gXCJiYXNpY1wiID8gXCJISG1tXCIgOiBcIkhIOm1tXCI7XG5cbiAgaWYgKCFzdXBwcmVzc1NlY29uZHMgfHwgZHQuc2Vjb25kICE9PSAwIHx8IGR0Lm1pbGxpc2Vjb25kICE9PSAwKSB7XG4gICAgZm10ICs9IGZvcm1hdCA9PT0gXCJiYXNpY1wiID8gXCJzc1wiIDogXCI6c3NcIjtcbiAgICBpZiAoIXN1cHByZXNzTWlsbGlzZWNvbmRzIHx8IGR0Lm1pbGxpc2Vjb25kICE9PSAwKSB7XG4gICAgICBmbXQgKz0gXCIuU1NTXCI7XG4gICAgfVxuICB9XG5cbiAgaWYgKChpbmNsdWRlWm9uZSB8fCBpbmNsdWRlT2Zmc2V0KSAmJiBzcGFjZVpvbmUpIHtcbiAgICBmbXQgKz0gXCIgXCI7XG4gIH1cblxuICBpZiAoaW5jbHVkZVpvbmUpIHtcbiAgICBmbXQgKz0gXCJ6XCI7XG4gIH0gZWxzZSBpZiAoaW5jbHVkZU9mZnNldCkge1xuICAgIGZtdCArPSBmb3JtYXQgPT09IFwiYmFzaWNcIiA/IFwiWlpaXCIgOiBcIlpaXCI7XG4gIH1cblxuICBsZXQgc3RyID0gdG9UZWNoRm9ybWF0KGR0LCBmbXQpO1xuXG4gIGlmIChpbmNsdWRlUHJlZml4KSB7XG4gICAgc3RyID0gXCJUXCIgKyBzdHI7XG4gIH1cblxuICByZXR1cm4gc3RyO1xufVxuXG4vLyBkZWZhdWx0cyBmb3IgdW5zcGVjaWZpZWQgdW5pdHMgaW4gdGhlIHN1cHBvcnRlZCBjYWxlbmRhcnNcbmNvbnN0IGRlZmF1bHRVbml0VmFsdWVzID0ge1xuICAgIG1vbnRoOiAxLFxuICAgIGRheTogMSxcbiAgICBob3VyOiAwLFxuICAgIG1pbnV0ZTogMCxcbiAgICBzZWNvbmQ6IDAsXG4gICAgbWlsbGlzZWNvbmQ6IDAsXG4gIH0sXG4gIGRlZmF1bHRXZWVrVW5pdFZhbHVlcyA9IHtcbiAgICB3ZWVrTnVtYmVyOiAxLFxuICAgIHdlZWtkYXk6IDEsXG4gICAgaG91cjogMCxcbiAgICBtaW51dGU6IDAsXG4gICAgc2Vjb25kOiAwLFxuICAgIG1pbGxpc2Vjb25kOiAwLFxuICB9LFxuICBkZWZhdWx0T3JkaW5hbFVuaXRWYWx1ZXMgPSB7XG4gICAgb3JkaW5hbDogMSxcbiAgICBob3VyOiAwLFxuICAgIG1pbnV0ZTogMCxcbiAgICBzZWNvbmQ6IDAsXG4gICAgbWlsbGlzZWNvbmQ6IDAsXG4gIH07XG5cbi8vIFVuaXRzIGluIHRoZSBzdXBwb3J0ZWQgY2FsZW5kYXJzLCBzb3J0ZWQgYnkgYmlnbmVzc1xuY29uc3Qgb3JkZXJlZFVuaXRzID0gW1wieWVhclwiLCBcIm1vbnRoXCIsIFwiZGF5XCIsIFwiaG91clwiLCBcIm1pbnV0ZVwiLCBcInNlY29uZFwiLCBcIm1pbGxpc2Vjb25kXCJdLFxuICBvcmRlcmVkV2Vla1VuaXRzID0gW1xuICAgIFwid2Vla1llYXJcIixcbiAgICBcIndlZWtOdW1iZXJcIixcbiAgICBcIndlZWtkYXlcIixcbiAgICBcImhvdXJcIixcbiAgICBcIm1pbnV0ZVwiLFxuICAgIFwic2Vjb25kXCIsXG4gICAgXCJtaWxsaXNlY29uZFwiLFxuICBdLFxuICBvcmRlcmVkT3JkaW5hbFVuaXRzID0gW1wieWVhclwiLCBcIm9yZGluYWxcIiwgXCJob3VyXCIsIFwibWludXRlXCIsIFwic2Vjb25kXCIsIFwibWlsbGlzZWNvbmRcIl07XG5cbi8vIHN0YW5kYXJkaXplIGNhc2UgYW5kIHBsdXJhbGl0eSBpbiB1bml0c1xuZnVuY3Rpb24gbm9ybWFsaXplVW5pdCh1bml0KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB7XG4gICAgeWVhcjogXCJ5ZWFyXCIsXG4gICAgeWVhcnM6IFwieWVhclwiLFxuICAgIG1vbnRoOiBcIm1vbnRoXCIsXG4gICAgbW9udGhzOiBcIm1vbnRoXCIsXG4gICAgZGF5OiBcImRheVwiLFxuICAgIGRheXM6IFwiZGF5XCIsXG4gICAgaG91cjogXCJob3VyXCIsXG4gICAgaG91cnM6IFwiaG91clwiLFxuICAgIG1pbnV0ZTogXCJtaW51dGVcIixcbiAgICBtaW51dGVzOiBcIm1pbnV0ZVwiLFxuICAgIHF1YXJ0ZXI6IFwicXVhcnRlclwiLFxuICAgIHF1YXJ0ZXJzOiBcInF1YXJ0ZXJcIixcbiAgICBzZWNvbmQ6IFwic2Vjb25kXCIsXG4gICAgc2Vjb25kczogXCJzZWNvbmRcIixcbiAgICBtaWxsaXNlY29uZDogXCJtaWxsaXNlY29uZFwiLFxuICAgIG1pbGxpc2Vjb25kczogXCJtaWxsaXNlY29uZFwiLFxuICAgIHdlZWtkYXk6IFwid2Vla2RheVwiLFxuICAgIHdlZWtkYXlzOiBcIndlZWtkYXlcIixcbiAgICB3ZWVrbnVtYmVyOiBcIndlZWtOdW1iZXJcIixcbiAgICB3ZWVrc251bWJlcjogXCJ3ZWVrTnVtYmVyXCIsXG4gICAgd2Vla251bWJlcnM6IFwid2Vla051bWJlclwiLFxuICAgIHdlZWt5ZWFyOiBcIndlZWtZZWFyXCIsXG4gICAgd2Vla3llYXJzOiBcIndlZWtZZWFyXCIsXG4gICAgb3JkaW5hbDogXCJvcmRpbmFsXCIsXG4gIH1bdW5pdC50b0xvd2VyQ2FzZSgpXTtcblxuICBpZiAoIW5vcm1hbGl6ZWQpIHRocm93IG5ldyBJbnZhbGlkVW5pdEVycm9yKHVuaXQpO1xuXG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuXG4vLyB0aGlzIGlzIGEgZHVtYmVkIGRvd24gdmVyc2lvbiBvZiBmcm9tT2JqZWN0KCkgdGhhdCBydW5zIGFib3V0IDYwJSBmYXN0ZXJcbi8vIGJ1dCBkb2Vzbid0IGRvIGFueSB2YWxpZGF0aW9uLCBtYWtlcyBhIGJ1bmNoIG9mIGFzc3VtcHRpb25zIGFib3V0IHdoYXQgdW5pdHNcbi8vIGFyZSBwcmVzZW50LCBhbmQgc28gb24uXG5cbi8vIHRoaXMgaXMgYSBkdW1iZWQgZG93biB2ZXJzaW9uIG9mIGZyb21PYmplY3QoKSB0aGF0IHJ1bnMgYWJvdXQgNjAlIGZhc3RlclxuLy8gYnV0IGRvZXNuJ3QgZG8gYW55IHZhbGlkYXRpb24sIG1ha2VzIGEgYnVuY2ggb2YgYXNzdW1wdGlvbnMgYWJvdXQgd2hhdCB1bml0c1xuLy8gYXJlIHByZXNlbnQsIGFuZCBzbyBvbi5cbmZ1bmN0aW9uIHF1aWNrRFQob2JqLCBvcHRzKSB7XG4gIGNvbnN0IHpvbmUgPSBub3JtYWxpemVab25lKG9wdHMuem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpLFxuICAgIGxvYyA9IExvY2FsZS5mcm9tT2JqZWN0KG9wdHMpLFxuICAgIHRzTm93ID0gU2V0dGluZ3Mubm93KCk7XG5cbiAgbGV0IHRzLCBvO1xuXG4gIC8vIGFzc3VtZSB3ZSBoYXZlIHRoZSBoaWdoZXItb3JkZXIgdW5pdHNcbiAgaWYgKCFpc1VuZGVmaW5lZChvYmoueWVhcikpIHtcbiAgICBmb3IgKGNvbnN0IHUgb2Ygb3JkZXJlZFVuaXRzKSB7XG4gICAgICBpZiAoaXNVbmRlZmluZWQob2JqW3VdKSkge1xuICAgICAgICBvYmpbdV0gPSBkZWZhdWx0VW5pdFZhbHVlc1t1XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpbnZhbGlkID0gaGFzSW52YWxpZEdyZWdvcmlhbkRhdGEob2JqKSB8fCBoYXNJbnZhbGlkVGltZURhdGEob2JqKTtcbiAgICBpZiAoaW52YWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZCk7XG4gICAgfVxuXG4gICAgY29uc3Qgb2Zmc2V0UHJvdmlzID0gem9uZS5vZmZzZXQodHNOb3cpO1xuICAgIFt0cywgb10gPSBvYmpUb1RTKG9iaiwgb2Zmc2V0UHJvdmlzLCB6b25lKTtcbiAgfSBlbHNlIHtcbiAgICB0cyA9IHRzTm93O1xuICB9XG5cbiAgcmV0dXJuIG5ldyBEYXRlVGltZSh7IHRzLCB6b25lLCBsb2MsIG8gfSk7XG59XG5cbmZ1bmN0aW9uIGRpZmZSZWxhdGl2ZShzdGFydCwgZW5kLCBvcHRzKSB7XG4gIGNvbnN0IHJvdW5kID0gaXNVbmRlZmluZWQob3B0cy5yb3VuZCkgPyB0cnVlIDogb3B0cy5yb3VuZCxcbiAgICBmb3JtYXQgPSAoYywgdW5pdCkgPT4ge1xuICAgICAgYyA9IHJvdW5kVG8oYywgcm91bmQgfHwgb3B0cy5jYWxlbmRhcnkgPyAwIDogMiwgdHJ1ZSk7XG4gICAgICBjb25zdCBmb3JtYXR0ZXIgPSBlbmQubG9jLmNsb25lKG9wdHMpLnJlbEZvcm1hdHRlcihvcHRzKTtcbiAgICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KGMsIHVuaXQpO1xuICAgIH0sXG4gICAgZGlmZmVyID0gKHVuaXQpID0+IHtcbiAgICAgIGlmIChvcHRzLmNhbGVuZGFyeSkge1xuICAgICAgICBpZiAoIWVuZC5oYXNTYW1lKHN0YXJ0LCB1bml0KSkge1xuICAgICAgICAgIHJldHVybiBlbmQuc3RhcnRPZih1bml0KS5kaWZmKHN0YXJ0LnN0YXJ0T2YodW5pdCksIHVuaXQpLmdldCh1bml0KTtcbiAgICAgICAgfSBlbHNlIHJldHVybiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVuZC5kaWZmKHN0YXJ0LCB1bml0KS5nZXQodW5pdCk7XG4gICAgICB9XG4gICAgfTtcblxuICBpZiAob3B0cy51bml0KSB7XG4gICAgcmV0dXJuIGZvcm1hdChkaWZmZXIob3B0cy51bml0KSwgb3B0cy51bml0KTtcbiAgfVxuXG4gIGZvciAoY29uc3QgdW5pdCBvZiBvcHRzLnVuaXRzKSB7XG4gICAgY29uc3QgY291bnQgPSBkaWZmZXIodW5pdCk7XG4gICAgaWYgKE1hdGguYWJzKGNvdW50KSA+PSAxKSB7XG4gICAgICByZXR1cm4gZm9ybWF0KGNvdW50LCB1bml0KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZvcm1hdChzdGFydCA+IGVuZCA/IC0wIDogMCwgb3B0cy51bml0c1tvcHRzLnVuaXRzLmxlbmd0aCAtIDFdKTtcbn1cblxuZnVuY3Rpb24gbGFzdE9wdHMoYXJnTGlzdCkge1xuICBsZXQgb3B0cyA9IHt9LFxuICAgIGFyZ3M7XG4gIGlmIChhcmdMaXN0Lmxlbmd0aCA+IDAgJiYgdHlwZW9mIGFyZ0xpc3RbYXJnTGlzdC5sZW5ndGggLSAxXSA9PT0gXCJvYmplY3RcIikge1xuICAgIG9wdHMgPSBhcmdMaXN0W2FyZ0xpc3QubGVuZ3RoIC0gMV07XG4gICAgYXJncyA9IEFycmF5LmZyb20oYXJnTGlzdCkuc2xpY2UoMCwgYXJnTGlzdC5sZW5ndGggLSAxKTtcbiAgfSBlbHNlIHtcbiAgICBhcmdzID0gQXJyYXkuZnJvbShhcmdMaXN0KTtcbiAgfVxuICByZXR1cm4gW29wdHMsIGFyZ3NdO1xufVxuXG4vKipcbiAqIEEgRGF0ZVRpbWUgaXMgYW4gaW1tdXRhYmxlIGRhdGEgc3RydWN0dXJlIHJlcHJlc2VudGluZyBhIHNwZWNpZmljIGRhdGUgYW5kIHRpbWUgYW5kIGFjY29tcGFueWluZyBtZXRob2RzLiBJdCBjb250YWlucyBjbGFzcyBhbmQgaW5zdGFuY2UgbWV0aG9kcyBmb3IgY3JlYXRpbmcsIHBhcnNpbmcsIGludGVycm9nYXRpbmcsIHRyYW5zZm9ybWluZywgYW5kIGZvcm1hdHRpbmcgdGhlbS5cbiAqXG4gKiBBIERhdGVUaW1lIGNvbXByaXNlcyBvZjpcbiAqICogQSB0aW1lc3RhbXAuIEVhY2ggRGF0ZVRpbWUgaW5zdGFuY2UgcmVmZXJzIHRvIGEgc3BlY2lmaWMgbWlsbGlzZWNvbmQgb2YgdGhlIFVuaXggZXBvY2guXG4gKiAqIEEgdGltZSB6b25lLiBFYWNoIGluc3RhbmNlIGlzIGNvbnNpZGVyZWQgaW4gdGhlIGNvbnRleHQgb2YgYSBzcGVjaWZpYyB6b25lIChieSBkZWZhdWx0IHRoZSBsb2NhbCBzeXN0ZW0ncyB6b25lKS5cbiAqICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIHRoYXQgZWZmZWN0IGhvdyBvdXRwdXQgc3RyaW5ncyBhcmUgZm9ybWF0dGVkLCBzdWNoIGFzIGBsb2NhbGVgLCBgbnVtYmVyaW5nU3lzdGVtYCwgYW5kIGBvdXRwdXRDYWxlbmRhcmAuXG4gKlxuICogSGVyZSBpcyBhIGJyaWVmIG92ZXJ2aWV3IG9mIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgZnVuY3Rpb25hbGl0eSBpdCBwcm92aWRlczpcbiAqXG4gKiAqICoqQ3JlYXRpb24qKjogVG8gY3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBpdHMgY29tcG9uZW50cywgdXNlIG9uZSBvZiBpdHMgZmFjdG9yeSBjbGFzcyBtZXRob2RzOiB7QGxpbmsgRGF0ZVRpbWUubG9jYWx9LCB7QGxpbmsgRGF0ZVRpbWUudXRjfSwgYW5kIChtb3N0IGZsZXhpYmx5KSB7QGxpbmsgRGF0ZVRpbWUuZnJvbU9iamVjdH0uIFRvIGNyZWF0ZSBvbmUgZnJvbSBhIHN0YW5kYXJkIHN0cmluZyBmb3JtYXQsIHVzZSB7QGxpbmsgRGF0ZVRpbWUuZnJvbUlTT30sIHtAbGluayBEYXRlVGltZS5mcm9tSFRUUH0sIGFuZCB7QGxpbmsgRGF0ZVRpbWUuZnJvbVJGQzI4MjJ9LiBUbyBjcmVhdGUgb25lIGZyb20gYSBjdXN0b20gc3RyaW5nIGZvcm1hdCwgdXNlIHtAbGluayBEYXRlVGltZS5mcm9tRm9ybWF0fS4gVG8gY3JlYXRlIG9uZSBmcm9tIGEgbmF0aXZlIEpTIGRhdGUsIHVzZSB7QGxpbmsgRGF0ZVRpbWUuZnJvbUpTRGF0ZX0uXG4gKiAqICoqR3JlZ29yaWFuIGNhbGVuZGFyIGFuZCB0aW1lKio6IFRvIGV4YW1pbmUgdGhlIEdyZWdvcmlhbiBwcm9wZXJ0aWVzIG9mIGEgRGF0ZVRpbWUgaW5kaXZpZHVhbGx5IChpLmUgYXMgb3Bwb3NlZCB0byBjb2xsZWN0aXZlbHkgdGhyb3VnaCB7QGxpbmsgRGF0ZVRpbWUjdG9PYmplY3R9KSwgdXNlIHRoZSB7QGxpbmsgRGF0ZVRpbWUjeWVhcn0sIHtAbGluayBEYXRlVGltZSNtb250aH0sXG4gKiB7QGxpbmsgRGF0ZVRpbWUjZGF5fSwge0BsaW5rIERhdGVUaW1lI2hvdXJ9LCB7QGxpbmsgRGF0ZVRpbWUjbWludXRlfSwge0BsaW5rIERhdGVUaW1lI3NlY29uZH0sIHtAbGluayBEYXRlVGltZSNtaWxsaXNlY29uZH0gYWNjZXNzb3JzLlxuICogKiAqKldlZWsgY2FsZW5kYXIqKjogRm9yIElTTyB3ZWVrIGNhbGVuZGFyIGF0dHJpYnV0ZXMsIHNlZSB0aGUge0BsaW5rIERhdGVUaW1lI3dlZWtZZWFyfSwge0BsaW5rIERhdGVUaW1lI3dlZWtOdW1iZXJ9LCBhbmQge0BsaW5rIERhdGVUaW1lI3dlZWtkYXl9IGFjY2Vzc29ycy5cbiAqICogKipDb25maWd1cmF0aW9uKiogU2VlIHRoZSB7QGxpbmsgRGF0ZVRpbWUjbG9jYWxlfSBhbmQge0BsaW5rIERhdGVUaW1lI251bWJlcmluZ1N5c3RlbX0gYWNjZXNzb3JzLlxuICogKiAqKlRyYW5zZm9ybWF0aW9uKio6IFRvIHRyYW5zZm9ybSB0aGUgRGF0ZVRpbWUgaW50byBvdGhlciBEYXRlVGltZXMsIHVzZSB7QGxpbmsgRGF0ZVRpbWUjc2V0fSwge0BsaW5rIERhdGVUaW1lI3JlY29uZmlndXJlfSwge0BsaW5rIERhdGVUaW1lI3NldFpvbmV9LCB7QGxpbmsgRGF0ZVRpbWUjc2V0TG9jYWxlfSwge0BsaW5rIERhdGVUaW1lLnBsdXN9LCB7QGxpbmsgRGF0ZVRpbWUjbWludXN9LCB7QGxpbmsgRGF0ZVRpbWUjZW5kT2Z9LCB7QGxpbmsgRGF0ZVRpbWUjc3RhcnRPZn0sIHtAbGluayBEYXRlVGltZSN0b1VUQ30sIGFuZCB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbH0uXG4gKiAqICoqT3V0cHV0Kio6IFRvIGNvbnZlcnQgdGhlIERhdGVUaW1lIHRvIG90aGVyIHJlcHJlc2VudGF0aW9ucywgdXNlIHRoZSB7QGxpbmsgRGF0ZVRpbWUjdG9SZWxhdGl2ZX0sIHtAbGluayBEYXRlVGltZSN0b1JlbGF0aXZlQ2FsZW5kYXJ9LCB7QGxpbmsgRGF0ZVRpbWUjdG9KU09OfSwge0BsaW5rIERhdGVUaW1lI3RvSVNPfSwge0BsaW5rIERhdGVUaW1lI3RvSFRUUH0sIHtAbGluayBEYXRlVGltZSN0b09iamVjdH0sIHtAbGluayBEYXRlVGltZSN0b1JGQzI4MjJ9LCB7QGxpbmsgRGF0ZVRpbWUjdG9TdHJpbmd9LCB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9LCB7QGxpbmsgRGF0ZVRpbWUjdG9Gb3JtYXR9LCB7QGxpbmsgRGF0ZVRpbWUjdG9NaWxsaXN9IGFuZCB7QGxpbmsgRGF0ZVRpbWUjdG9KU0RhdGV9LlxuICpcbiAqIFRoZXJlJ3MgcGxlbnR5IG90aGVycyBkb2N1bWVudGVkIGJlbG93LiBJbiBhZGRpdGlvbiwgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc3VidGxlciB0b3BpY3MgbGlrZSBpbnRlcm5hdGlvbmFsaXphdGlvbiwgdGltZSB6b25lcywgYWx0ZXJuYXRpdmUgY2FsZW5kYXJzLCB2YWxpZGl0eSwgYW5kIHNvIG9uLCBzZWUgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhdGVUaW1lIHtcbiAgLyoqXG4gICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgY29uc3Qgem9uZSA9IGNvbmZpZy56b25lIHx8IFNldHRpbmdzLmRlZmF1bHRab25lO1xuXG4gICAgbGV0IGludmFsaWQgPVxuICAgICAgY29uZmlnLmludmFsaWQgfHxcbiAgICAgIChOdW1iZXIuaXNOYU4oY29uZmlnLnRzKSA/IG5ldyBJbnZhbGlkKFwiaW52YWxpZCBpbnB1dFwiKSA6IG51bGwpIHx8XG4gICAgICAoIXpvbmUuaXNWYWxpZCA/IHVuc3VwcG9ydGVkWm9uZSh6b25lKSA6IG51bGwpO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMudHMgPSBpc1VuZGVmaW5lZChjb25maWcudHMpID8gU2V0dGluZ3Mubm93KCkgOiBjb25maWcudHM7XG5cbiAgICBsZXQgYyA9IG51bGwsXG4gICAgICBvID0gbnVsbDtcbiAgICBpZiAoIWludmFsaWQpIHtcbiAgICAgIGNvbnN0IHVuY2hhbmdlZCA9IGNvbmZpZy5vbGQgJiYgY29uZmlnLm9sZC50cyA9PT0gdGhpcy50cyAmJiBjb25maWcub2xkLnpvbmUuZXF1YWxzKHpvbmUpO1xuXG4gICAgICBpZiAodW5jaGFuZ2VkKSB7XG4gICAgICAgIFtjLCBvXSA9IFtjb25maWcub2xkLmMsIGNvbmZpZy5vbGQub107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBvdCA9IHpvbmUub2Zmc2V0KHRoaXMudHMpO1xuICAgICAgICBjID0gdHNUb09iaih0aGlzLnRzLCBvdCk7XG4gICAgICAgIGludmFsaWQgPSBOdW1iZXIuaXNOYU4oYy55ZWFyKSA/IG5ldyBJbnZhbGlkKFwiaW52YWxpZCBpbnB1dFwiKSA6IG51bGw7XG4gICAgICAgIGMgPSBpbnZhbGlkID8gbnVsbCA6IGM7XG4gICAgICAgIG8gPSBpbnZhbGlkID8gbnVsbCA6IG90O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuX3pvbmUgPSB6b25lO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMubG9jID0gY29uZmlnLmxvYyB8fCBMb2NhbGUuY3JlYXRlKCk7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5pbnZhbGlkID0gaW52YWxpZDtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLndlZWtEYXRhID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmMgPSBjO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMubyA9IG87XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5pc0x1eG9uRGF0ZVRpbWUgPSB0cnVlO1xuICB9XG5cbiAgLy8gQ09OU1RSVUNUXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZvciB0aGUgY3VycmVudCBpbnN0YW50LCBpbiB0aGUgc3lzdGVtJ3MgdGltZSB6b25lLlxuICAgKlxuICAgKiBVc2UgU2V0dGluZ3MgdG8gb3ZlcnJpZGUgdGhlc2UgZGVmYXVsdCB2YWx1ZXMgaWYgbmVlZGVkLlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0lTTygpIC8vfj4gbm93IGluIHRoZSBJU08gZm9ybWF0XG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc3RhdGljIG5vdygpIHtcbiAgICByZXR1cm4gbmV3IERhdGVUaW1lKHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBsb2NhbCBEYXRlVGltZVxuICAgKiBAcGFyYW0ge251bWJlcn0gW3llYXJdIC0gVGhlIGNhbGVuZGFyIHllYXIuIElmIG9taXR0ZWQgKGFzIGluLCBjYWxsIGBsb2NhbCgpYCB3aXRoIG5vIGFyZ3VtZW50cyksIHRoZSBjdXJyZW50IHRpbWUgd2lsbCBiZSB1c2VkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbW9udGg9MV0gLSBUaGUgbW9udGgsIDEtaW5kZXhlZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RheT0xXSAtIFRoZSBkYXkgb2YgdGhlIG1vbnRoLCAxLWluZGV4ZWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtob3VyPTBdIC0gVGhlIGhvdXIgb2YgdGhlIGRheSwgaW4gMjQtaG91ciB0aW1lXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWludXRlPTBdIC0gVGhlIG1pbnV0ZSBvZiB0aGUgaG91ciwgbWVhbmluZyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbc2Vjb25kPTBdIC0gVGhlIHNlY29uZCBvZiB0aGUgbWludXRlLCBtZWFuaW5nIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNTlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaWxsaXNlY29uZD0wXSAtIFRoZSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kLCBtZWFuaW5nIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgOTk5XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiBub3dcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoeyB6b25lOiBcIkFtZXJpY2EvTmV3X1lvcmtcIiB9KSAgICAgIC8vfj4gbm93LCBpbiBVUyBlYXN0IGNvYXN0IHRpbWVcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDEtMDFUMDA6MDA6MDBcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMykgICAgICAgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMDFUMDA6MDA6MDBcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMywgMTIsIHsgbG9jYWxlOiBcImZyXCIgfSkgICAgIC8vfj4gMjAxNy0wMy0xMlQwMDowMDowMCwgd2l0aCBhIEZyZW5jaCBsb2NhbGVcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMywgMTIsIDUpICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDU6MDA6MDBcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMywgMTIsIDUsIHsgem9uZTogXCJ1dGNcIiB9KSAgIC8vfj4gMjAxNy0wMy0xMlQwNTowMDowMCwgaW4gVVRDXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1LCA0NSkgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjAwXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1LCA0NSwgMTApICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjEwXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1LCA0NSwgMTAsIDc2NSkgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjEwLjc2NVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBsb2NhbCgpIHtcbiAgICBjb25zdCBbb3B0cywgYXJnc10gPSBsYXN0T3B0cyhhcmd1bWVudHMpLFxuICAgICAgW3llYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZF0gPSBhcmdzO1xuICAgIHJldHVybiBxdWlja0RUKHsgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kIH0sIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGluIFVUQ1xuICAgKiBAcGFyYW0ge251bWJlcn0gW3llYXJdIC0gVGhlIGNhbGVuZGFyIHllYXIuIElmIG9taXR0ZWQgKGFzIGluLCBjYWxsIGB1dGMoKWAgd2l0aCBubyBhcmd1bWVudHMpLCB0aGUgY3VycmVudCB0aW1lIHdpbGwgYmUgdXNlZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW21vbnRoPTFdIC0gVGhlIG1vbnRoLCAxLWluZGV4ZWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXk9MV0gLSBUaGUgZGF5IG9mIHRoZSBtb250aFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2hvdXI9MF0gLSBUaGUgaG91ciBvZiB0aGUgZGF5LCBpbiAyNC1ob3VyIHRpbWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaW51dGU9MF0gLSBUaGUgbWludXRlIG9mIHRoZSBob3VyLCBtZWFuaW5nIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNTlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtzZWNvbmQ9MF0gLSBUaGUgc2Vjb25kIG9mIHRoZSBtaW51dGUsIG1lYW5pbmcgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCA1OVxuICAgKiBAcGFyYW0ge251bWJlcn0gW21pbGxpc2Vjb25kPTBdIC0gVGhlIG1pbGxpc2Vjb25kIG9mIHRoZSBzZWNvbmQsIG1lYW5pbmcgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCA5OTlcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBEYXRlVGltZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9jYWxlXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5vdXRwdXRDYWxlbmRhcl0gLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5udW1iZXJpbmdTeXN0ZW1dIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiBub3dcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAxLTAxVDAwOjAwOjAwWlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMDFUMDA6MDA6MDBaXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzLCAxMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwMDowMDowMFpcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyLCA1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjAwOjAwWlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUsIDQ1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDU6NDU6MDBaXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzLCAxMiwgNSwgNDUsIHsgbG9jYWxlOiBcImZyXCIgfSkgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjAwWiB3aXRoIGEgRnJlbmNoIGxvY2FsZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUsIDQ1LCAxMCkgICAgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDU6NDU6MTBaXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzLCAxMiwgNSwgNDUsIDEwLCA3NjUsIHsgbG9jYWxlOiBcImZyXCIgfSkgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjEwLjc2NVogd2l0aCBhIEZyZW5jaCBsb2NhbGVcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzdGF0aWMgdXRjKCkge1xuICAgIGNvbnN0IFtvcHRzLCBhcmdzXSA9IGxhc3RPcHRzKGFyZ3VtZW50cyksXG4gICAgICBbeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kXSA9IGFyZ3M7XG5cbiAgICBvcHRzLnpvbmUgPSBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2U7XG4gICAgcmV0dXJuIHF1aWNrRFQoeyB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQgfSwgb3B0cyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhIEphdmFTY3JpcHQgRGF0ZSBvYmplY3QuIFVzZXMgdGhlIGRlZmF1bHQgem9uZS5cbiAgICogQHBhcmFtIHtEYXRlfSBkYXRlIC0gYSBKYXZhU2NyaXB0IERhdGUgb2JqZWN0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdGlvbnMuem9uZT0nbG9jYWwnXSAtIHRoZSB6b25lIHRvIHBsYWNlIHRoZSBEYXRlVGltZSBpbnRvXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc3RhdGljIGZyb21KU0RhdGUoZGF0ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgdHMgPSBpc0RhdGUoZGF0ZSkgPyBkYXRlLnZhbHVlT2YoKSA6IE5hTjtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHRzKSkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoXCJpbnZhbGlkIGlucHV0XCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHpvbmVUb1VzZSA9IG5vcm1hbGl6ZVpvbmUob3B0aW9ucy56b25lLCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSk7XG4gICAgaWYgKCF6b25lVG9Vc2UuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQodW5zdXBwb3J0ZWRab25lKHpvbmVUb1VzZSkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgICAgdHM6IHRzLFxuICAgICAgem9uZTogem9uZVRvVXNlLFxuICAgICAgbG9jOiBMb2NhbGUuZnJvbU9iamVjdChvcHRpb25zKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2ggKG1lYW5pbmcgc2luY2UgMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS4gVXNlcyB0aGUgZGVmYXVsdCB6b25lLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbWlsbGlzZWNvbmRzIC0gYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIDE5NzAgVVRDXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdGlvbnMuem9uZT0nbG9jYWwnXSAtIHRoZSB6b25lIHRvIHBsYWNlIHRoZSBEYXRlVGltZSBpbnRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sb2NhbGVdIC0gYSBsb2NhbGUgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc3RhdGljIGZyb21NaWxsaXMobWlsbGlzZWNvbmRzLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAoIWlzTnVtYmVyKG1pbGxpc2Vjb25kcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgYGZyb21NaWxsaXMgcmVxdWlyZXMgYSBudW1lcmljYWwgaW5wdXQsIGJ1dCByZWNlaXZlZCBhICR7dHlwZW9mIG1pbGxpc2Vjb25kc30gd2l0aCB2YWx1ZSAke21pbGxpc2Vjb25kc31gXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAobWlsbGlzZWNvbmRzIDwgLU1BWF9EQVRFIHx8IG1pbGxpc2Vjb25kcyA+IE1BWF9EQVRFKSB7XG4gICAgICAvLyB0aGlzIGlzbid0IHBlcmZlY3QgYmVjYXVzZSBiZWNhdXNlIHdlIGNhbiBzdGlsbCBlbmQgdXAgb3V0IG9mIHJhbmdlIGJlY2F1c2Ugb2YgYWRkaXRpb25hbCBzaGlmdGluZywgYnV0IGl0J3MgYSBzdGFydFxuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoXCJUaW1lc3RhbXAgb3V0IG9mIHJhbmdlXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IERhdGVUaW1lKHtcbiAgICAgICAgdHM6IG1pbGxpc2Vjb25kcyxcbiAgICAgICAgem9uZTogbm9ybWFsaXplWm9uZShvcHRpb25zLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKSxcbiAgICAgICAgbG9jOiBMb2NhbGUuZnJvbU9iamVjdChvcHRpb25zKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgdGhlIGVwb2NoIChtZWFuaW5nIHNpbmNlIDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuIFVzZXMgdGhlIGRlZmF1bHQgem9uZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHNlY29uZHMgLSBhIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIDE5NzAgVVRDXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdGlvbnMuem9uZT0nbG9jYWwnXSAtIHRoZSB6b25lIHRvIHBsYWNlIHRoZSBEYXRlVGltZSBpbnRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sb2NhbGVdIC0gYSBsb2NhbGUgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc3RhdGljIGZyb21TZWNvbmRzKHNlY29uZHMsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICghaXNOdW1iZXIoc2Vjb25kcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcImZyb21TZWNvbmRzIHJlcXVpcmVzIGEgbnVtZXJpY2FsIGlucHV0XCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IERhdGVUaW1lKHtcbiAgICAgICAgdHM6IHNlY29uZHMgKiAxMDAwLFxuICAgICAgICB6b25lOiBub3JtYWxpemVab25lKG9wdGlvbnMuem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpLFxuICAgICAgICBsb2M6IExvY2FsZS5mcm9tT2JqZWN0KG9wdGlvbnMpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBKYXZhU2NyaXB0IG9iamVjdCB3aXRoIGtleXMgbGlrZSAneWVhcicgYW5kICdob3VyJyB3aXRoIHJlYXNvbmFibGUgZGVmYXVsdHMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSB0aGUgb2JqZWN0IHRvIGNyZWF0ZSB0aGUgRGF0ZVRpbWUgZnJvbVxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnllYXIgLSBhIHllYXIsIHN1Y2ggYXMgMTk4N1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1vbnRoIC0gYSBtb250aCwgMS0xMlxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLmRheSAtIGEgZGF5IG9mIHRoZSBtb250aCwgMS0zMSwgZGVwZW5kaW5nIG9uIHRoZSBtb250aFxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm9yZGluYWwgLSBkYXkgb2YgdGhlIHllYXIsIDEtMzY1IG9yIDM2NlxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLndlZWtZZWFyIC0gYW4gSVNPIHdlZWsgeWVhclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLndlZWtOdW1iZXIgLSBhbiBJU08gd2VlayBudW1iZXIsIGJldHdlZW4gMSBhbmQgNTIgb3IgNTMsIGRlcGVuZGluZyBvbiB0aGUgeWVhclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLndlZWtkYXkgLSBhbiBJU08gd2Vla2RheSwgMS03LCB3aGVyZSAxIGlzIE1vbmRheSBhbmQgNyBpcyBTdW5kYXlcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5ob3VyIC0gaG91ciBvZiB0aGUgZGF5LCAwLTIzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubWludXRlIC0gbWludXRlIG9mIHRoZSBob3VyLCAwLTU5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouc2Vjb25kIC0gc2Vjb25kIG9mIHRoZSBtaW51dGUsIDAtNTlcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5taWxsaXNlY29uZCAtIG1pbGxpc2Vjb25kIG9mIHRoZSBzZWNvbmQsIDAtOTk5XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyBmb3IgY3JlYXRpbmcgdGhpcyBEYXRlVGltZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gaW50ZXJwcmV0IHRoZSBudW1iZXJzIGluIHRoZSBjb250ZXh0IG9mIGEgcGFydGljdWxhciB6b25lLiBDYW4gdGFrZSBhbnkgdmFsdWUgdGFrZW4gYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHNldFpvbmUoKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdzeXN0ZW0ncyBsb2NhbGUnXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgeWVhcjogMTk4MiwgbW9udGg6IDUsIGRheTogMjV9KS50b0lTT0RhdGUoKSAvLz0+ICcxOTgyLTA1LTI1J1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgeWVhcjogMTk4MiB9KS50b0lTT0RhdGUoKSAvLz0+ICcxOTgyLTAxLTAxJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiB9KSAvL34+IHRvZGF5IGF0IDEwOjI2OjA2XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyBob3VyOiAxMCwgbWludXRlOiAyNiwgc2Vjb25kOiA2IH0sIHsgem9uZTogJ3V0YycgfSksXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyBob3VyOiAxMCwgbWludXRlOiAyNiwgc2Vjb25kOiA2IH0sIHsgem9uZTogJ2xvY2FsJyB9KVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiB9LCB7IHpvbmU6ICdBbWVyaWNhL05ld19Zb3JrJyB9KVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgd2Vla1llYXI6IDIwMTYsIHdlZWtOdW1iZXI6IDIsIHdlZWtkYXk6IDMgfSkudG9JU09EYXRlKCkgLy89PiAnMjAxNi0wMS0xMydcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzdGF0aWMgZnJvbU9iamVjdChvYmosIG9wdHMgPSB7fSkge1xuICAgIG9iaiA9IG9iaiB8fCB7fTtcbiAgICBjb25zdCB6b25lVG9Vc2UgPSBub3JtYWxpemVab25lKG9wdHMuem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICAgIGlmICghem9uZVRvVXNlLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKHVuc3VwcG9ydGVkWm9uZSh6b25lVG9Vc2UpKTtcbiAgICB9XG5cbiAgICBjb25zdCB0c05vdyA9IFNldHRpbmdzLm5vdygpLFxuICAgICAgb2Zmc2V0UHJvdmlzID0gem9uZVRvVXNlLm9mZnNldCh0c05vdyksXG4gICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplT2JqZWN0KG9iaiwgbm9ybWFsaXplVW5pdCksXG4gICAgICBjb250YWluc09yZGluYWwgPSAhaXNVbmRlZmluZWQobm9ybWFsaXplZC5vcmRpbmFsKSxcbiAgICAgIGNvbnRhaW5zR3JlZ29yWWVhciA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLnllYXIpLFxuICAgICAgY29udGFpbnNHcmVnb3JNRCA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLm1vbnRoKSB8fCAhaXNVbmRlZmluZWQobm9ybWFsaXplZC5kYXkpLFxuICAgICAgY29udGFpbnNHcmVnb3IgPSBjb250YWluc0dyZWdvclllYXIgfHwgY29udGFpbnNHcmVnb3JNRCxcbiAgICAgIGRlZmluaXRlV2Vla0RlZiA9IG5vcm1hbGl6ZWQud2Vla1llYXIgfHwgbm9ybWFsaXplZC53ZWVrTnVtYmVyLFxuICAgICAgbG9jID0gTG9jYWxlLmZyb21PYmplY3Qob3B0cyk7XG5cbiAgICAvLyBjYXNlczpcbiAgICAvLyBqdXN0IGEgd2Vla2RheSAtPiB0aGlzIHdlZWsncyBpbnN0YW5jZSBvZiB0aGF0IHdlZWtkYXksIG5vIHdvcnJpZXNcbiAgICAvLyAoZ3JlZ29yaWFuIGRhdGEgb3Igb3JkaW5hbCkgKyAod2Vla1llYXIgb3Igd2Vla051bWJlcikgLT4gZXJyb3JcbiAgICAvLyAoZ3JlZ29yaWFuIG1vbnRoIG9yIGRheSkgKyBvcmRpbmFsIC0+IGVycm9yXG4gICAgLy8gb3RoZXJ3aXNlIGp1c3QgdXNlIHdlZWtzIG9yIG9yZGluYWxzIG9yIGdyZWdvcmlhbiwgZGVwZW5kaW5nIG9uIHdoYXQncyBzcGVjaWZpZWRcblxuICAgIGlmICgoY29udGFpbnNHcmVnb3IgfHwgY29udGFpbnNPcmRpbmFsKSAmJiBkZWZpbml0ZVdlZWtEZWYpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcihcbiAgICAgICAgXCJDYW4ndCBtaXggd2Vla1llYXIvd2Vla051bWJlciB1bml0cyB3aXRoIHllYXIvbW9udGgvZGF5IG9yIG9yZGluYWxzXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRhaW5zR3JlZ29yTUQgJiYgY29udGFpbnNPcmRpbmFsKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IoXCJDYW4ndCBtaXggb3JkaW5hbCBkYXRlcyB3aXRoIG1vbnRoL2RheVwiKTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VXZWVrRGF0YSA9IGRlZmluaXRlV2Vla0RlZiB8fCAobm9ybWFsaXplZC53ZWVrZGF5ICYmICFjb250YWluc0dyZWdvcik7XG5cbiAgICAvLyBjb25maWd1cmUgb3Vyc2VsdmVzIHRvIGRlYWwgd2l0aCBncmVnb3JpYW4gZGF0ZXMgb3Igd2VlayBzdHVmZlxuICAgIGxldCB1bml0cyxcbiAgICAgIGRlZmF1bHRWYWx1ZXMsXG4gICAgICBvYmpOb3cgPSB0c1RvT2JqKHRzTm93LCBvZmZzZXRQcm92aXMpO1xuICAgIGlmICh1c2VXZWVrRGF0YSkge1xuICAgICAgdW5pdHMgPSBvcmRlcmVkV2Vla1VuaXRzO1xuICAgICAgZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRXZWVrVW5pdFZhbHVlcztcbiAgICAgIG9iak5vdyA9IGdyZWdvcmlhblRvV2VlayhvYmpOb3cpO1xuICAgIH0gZWxzZSBpZiAoY29udGFpbnNPcmRpbmFsKSB7XG4gICAgICB1bml0cyA9IG9yZGVyZWRPcmRpbmFsVW5pdHM7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gZGVmYXVsdE9yZGluYWxVbml0VmFsdWVzO1xuICAgICAgb2JqTm93ID0gZ3JlZ29yaWFuVG9PcmRpbmFsKG9iak5vdyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuaXRzID0gb3JkZXJlZFVuaXRzO1xuICAgICAgZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRVbml0VmFsdWVzO1xuICAgIH1cblxuICAgIC8vIHNldCBkZWZhdWx0IHZhbHVlcyBmb3IgbWlzc2luZyBzdHVmZlxuICAgIGxldCBmb3VuZEZpcnN0ID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCB1IG9mIHVuaXRzKSB7XG4gICAgICBjb25zdCB2ID0gbm9ybWFsaXplZFt1XTtcbiAgICAgIGlmICghaXNVbmRlZmluZWQodikpIHtcbiAgICAgICAgZm91bmRGaXJzdCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGZvdW5kRmlyc3QpIHtcbiAgICAgICAgbm9ybWFsaXplZFt1XSA9IGRlZmF1bHRWYWx1ZXNbdV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub3JtYWxpemVkW3VdID0gb2JqTm93W3VdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIG1ha2Ugc3VyZSB0aGUgdmFsdWVzIHdlIGhhdmUgYXJlIGluIHJhbmdlXG4gICAgY29uc3QgaGlnaGVyT3JkZXJJbnZhbGlkID0gdXNlV2Vla0RhdGFcbiAgICAgICAgPyBoYXNJbnZhbGlkV2Vla0RhdGEobm9ybWFsaXplZClcbiAgICAgICAgOiBjb250YWluc09yZGluYWxcbiAgICAgICAgPyBoYXNJbnZhbGlkT3JkaW5hbERhdGEobm9ybWFsaXplZClcbiAgICAgICAgOiBoYXNJbnZhbGlkR3JlZ29yaWFuRGF0YShub3JtYWxpemVkKSxcbiAgICAgIGludmFsaWQgPSBoaWdoZXJPcmRlckludmFsaWQgfHwgaGFzSW52YWxpZFRpbWVEYXRhKG5vcm1hbGl6ZWQpO1xuXG4gICAgaWYgKGludmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKGludmFsaWQpO1xuICAgIH1cblxuICAgIC8vIGNvbXB1dGUgdGhlIGFjdHVhbCB0aW1lXG4gICAgY29uc3QgZ3JlZ29yaWFuID0gdXNlV2Vla0RhdGFcbiAgICAgICAgPyB3ZWVrVG9HcmVnb3JpYW4obm9ybWFsaXplZClcbiAgICAgICAgOiBjb250YWluc09yZGluYWxcbiAgICAgICAgPyBvcmRpbmFsVG9HcmVnb3JpYW4obm9ybWFsaXplZClcbiAgICAgICAgOiBub3JtYWxpemVkLFxuICAgICAgW3RzRmluYWwsIG9mZnNldEZpbmFsXSA9IG9ialRvVFMoZ3JlZ29yaWFuLCBvZmZzZXRQcm92aXMsIHpvbmVUb1VzZSksXG4gICAgICBpbnN0ID0gbmV3IERhdGVUaW1lKHtcbiAgICAgICAgdHM6IHRzRmluYWwsXG4gICAgICAgIHpvbmU6IHpvbmVUb1VzZSxcbiAgICAgICAgbzogb2Zmc2V0RmluYWwsXG4gICAgICAgIGxvYyxcbiAgICAgIH0pO1xuXG4gICAgLy8gZ3JlZ29yaWFuIGRhdGEgKyB3ZWVrZGF5IHNlcnZlcyBvbmx5IHRvIHZhbGlkYXRlXG4gICAgaWYgKG5vcm1hbGl6ZWQud2Vla2RheSAmJiBjb250YWluc0dyZWdvciAmJiBvYmoud2Vla2RheSAhPT0gaW5zdC53ZWVrZGF5KSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZChcbiAgICAgICAgXCJtaXNtYXRjaGVkIHdlZWtkYXlcIixcbiAgICAgICAgYHlvdSBjYW4ndCBzcGVjaWZ5IGJvdGggYSB3ZWVrZGF5IG9mICR7bm9ybWFsaXplZC53ZWVrZGF5fSBhbmQgYSBkYXRlIG9mICR7aW5zdC50b0lTTygpfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3Q7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhbiBJU08gODYwMSBzdHJpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgSVNPIHN0cmluZ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gdXNlIHRoaXMgem9uZSBpZiBubyBvZmZzZXQgaXMgc3BlY2lmaWVkIGluIHRoZSBpbnB1dCBzdHJpbmcgaXRzZWxmLiBXaWxsIGFsc28gY29udmVydCB0aGUgdGltZSB0byB0aGlzIHpvbmVcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggYSBmaXhlZC1vZmZzZXQgem9uZSBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZyBpdHNlbGYsIGlmIGl0IHNwZWNpZmllcyBvbmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nc3lzdGVtJ3MgbG9jYWxlJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMub3V0cHV0Q2FsZW5kYXJdIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtXSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtMDUtMjVUMDk6MDg6MzQuMTIzJylcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUlTTygnMjAxNi0wNS0yNVQwOTowODozNC4xMjMrMDY6MDAnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LTA1LTI1VDA5OjA4OjM0LjEyMyswNjowMCcsIHtzZXRab25lOiB0cnVlfSlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUlTTygnMjAxNi0wNS0yNVQwOTowODozNC4xMjMnLCB7em9uZTogJ3V0Yyd9KVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LVcwNS00JylcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzdGF0aWMgZnJvbUlTTyh0ZXh0LCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBbdmFscywgcGFyc2VkWm9uZV0gPSBwYXJzZUlTT0RhdGUodGV4dCk7XG4gICAgcmV0dXJuIHBhcnNlRGF0YVRvRGF0ZVRpbWUodmFscywgcGFyc2VkWm9uZSwgb3B0cywgXCJJU08gODYwMVwiLCB0ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGFuIFJGQyAyODIyIHN0cmluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBSRkMgMjgyMiBzdHJpbmdcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdHMuem9uZT0nbG9jYWwnXSAtIGNvbnZlcnQgdGhlIHRpbWUgdG8gdGhpcyB6b25lLiBTaW5jZSB0aGUgb2Zmc2V0IGlzIGFsd2F5cyBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZyBpdHNlbGYsIHRoaXMgaGFzIG5vIGVmZmVjdCBvbiB0aGUgaW50ZXJwcmV0YXRpb24gb2Ygc3RyaW5nLCBtZXJlbHkgdGhlIHpvbmUgdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpcyBleHByZXNzZWQgaW4uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc2V0Wm9uZT1mYWxzZV0gLSBvdmVycmlkZSB0aGUgem9uZSB3aXRoIGEgZml4ZWQtb2Zmc2V0IHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCBpZiBpdCBzcGVjaWZpZXMgb25lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J3N5c3RlbSdzIGxvY2FsZSddIC0gYSBsb2NhbGUgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21SRkMyODIyKCcyNSBOb3YgMjAxNiAxMzoyMzoxMiBHTVQnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tUkZDMjgyMignRnJpLCAyNSBOb3YgMjAxNiAxMzoyMzoxMiArMDYwMCcpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21SRkMyODIyKCcyNSBOb3YgMjAxNiAxMzoyMyBaJylcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzdGF0aWMgZnJvbVJGQzI4MjIodGV4dCwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgW3ZhbHMsIHBhcnNlZFpvbmVdID0gcGFyc2VSRkMyODIyRGF0ZSh0ZXh0KTtcbiAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRzLCBcIlJGQyAyODIyXCIsIHRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYW4gSFRUUCBoZWFkZXIgZGF0ZVxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzMuaHRtbCNzZWMzLjMuMVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBIVFRQIGhlYWRlciBkYXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0byBhZmZlY3QgdGhlIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRzLnpvbmU9J2xvY2FsJ10gLSBjb252ZXJ0IHRoZSB0aW1lIHRvIHRoaXMgem9uZS4gU2luY2UgSFRUUCBkYXRlcyBhcmUgYWx3YXlzIGluIFVUQywgdGhpcyBoYXMgbm8gZWZmZWN0IG9uIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzdHJpbmcsIG1lcmVseSB0aGUgem9uZSB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGlzIGV4cHJlc3NlZCBpbi5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggdGhlIGZpeGVkLW9mZnNldCB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nLiBGb3IgSFRUUCBkYXRlcywgdGhpcyBpcyBhbHdheXMgVVRDLCBzbyB0aGlzIG9wdGlvbiBpcyBlcXVpdmFsZW50IHRvIHNldHRpbmcgdGhlIGB6b25lYCBvcHRpb24gdG8gJ3V0YycsIGJ1dCB0aGlzIG9wdGlvbiBpcyBpbmNsdWRlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCBzaW1pbGFyIG1ldGhvZHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J3N5c3RlbSdzIGxvY2FsZSddIC0gYSBsb2NhbGUgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21IVFRQKCdTdW4sIDA2IE5vdiAxOTk0IDA4OjQ5OjM3IEdNVCcpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21IVFRQKCdTdW5kYXksIDA2LU5vdi05NCAwODo0OTozNyBHTVQnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSFRUUCgnU3VuIE5vdiAgNiAwODo0OTozNyAxOTk0JylcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzdGF0aWMgZnJvbUhUVFAodGV4dCwgb3B0cyA9IHt9KSB7XG4gICAgY29uc3QgW3ZhbHMsIHBhcnNlZFpvbmVdID0gcGFyc2VIVFRQRGF0ZSh0ZXh0KTtcbiAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRzLCBcIkhUVFBcIiwgb3B0cyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhbiBpbnB1dCBzdHJpbmcgYW5kIGZvcm1hdCBzdHJpbmcuXG4gICAqIERlZmF1bHRzIHRvIGVuLVVTIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHN5c3RlbSdzIGxvY2FsZS4gRm9yIGEgdGFibGUgb2YgdG9rZW5zIGFuZCB0aGVpciBpbnRlcnByZXRhdGlvbnMsIHNlZSBbaGVyZV0oaHR0cHM6Ly9tb21lbnQuZ2l0aHViLmlvL2x1eG9uLyMvcGFyc2luZz9pZD10YWJsZS1vZi10b2tlbnMpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBzdHJpbmcgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZtdCAtIHRoZSBmb3JtYXQgdGhlIHN0cmluZyBpcyBleHBlY3RlZCB0byBiZSBpbiAoc2VlIHRoZSBsaW5rIGJlbG93IGZvciB0aGUgZm9ybWF0cylcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdHMuem9uZT0nbG9jYWwnXSAtIHVzZSB0aGlzIHpvbmUgaWYgbm8gb2Zmc2V0IGlzIHNwZWNpZmllZCBpbiB0aGUgaW5wdXQgc3RyaW5nIGl0c2VsZi4gV2lsbCBhbHNvIGNvbnZlcnQgdGhlIERhdGVUaW1lIHRvIHRoaXMgem9uZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCBpZiBpdCBzcGVjaWZpZXMgb25lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSBhIGxvY2FsZSBzdHJpbmcgdG8gdXNlIHdoZW4gcGFyc2luZy4gV2lsbCBhbHNvIHNldCB0aGUgRGF0ZVRpbWUgdG8gdGhpcyBsb2NhbGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlIHdoZW4gcGFyc2luZy4gV2lsbCBhbHNvIHNldCB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIHRvIHRoaXMgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzdGF0aWMgZnJvbUZvcm1hdCh0ZXh0LCBmbXQsIG9wdHMgPSB7fSkge1xuICAgIGlmIChpc1VuZGVmaW5lZCh0ZXh0KSB8fCBpc1VuZGVmaW5lZChmbXQpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJmcm9tRm9ybWF0IHJlcXVpcmVzIGFuIGlucHV0IHN0cmluZyBhbmQgYSBmb3JtYXRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgeyBsb2NhbGUgPSBudWxsLCBudW1iZXJpbmdTeXN0ZW0gPSBudWxsIH0gPSBvcHRzLFxuICAgICAgbG9jYWxlVG9Vc2UgPSBMb2NhbGUuZnJvbU9wdHMoe1xuICAgICAgICBsb2NhbGUsXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgZGVmYXVsdFRvRU46IHRydWUsXG4gICAgICB9KSxcbiAgICAgIFt2YWxzLCBwYXJzZWRab25lLCBpbnZhbGlkXSA9IHBhcnNlRnJvbVRva2Vucyhsb2NhbGVUb1VzZSwgdGV4dCwgZm10KTtcbiAgICBpZiAoaW52YWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIGBmb3JtYXQgJHtmbXR9YCwgdGV4dCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBmcm9tRm9ybWF0IGluc3RlYWRcbiAgICovXG4gIHN0YXRpYyBmcm9tU3RyaW5nKHRleHQsIGZtdCwgb3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmZyb21Gb3JtYXQodGV4dCwgZm10LCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgU1FMIGRhdGUsIHRpbWUsIG9yIGRhdGV0aW1lXG4gICAqIERlZmF1bHRzIHRvIGVuLVVTIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHN5c3RlbSdzIGxvY2FsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBzdHJpbmcgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdHMuem9uZT0nbG9jYWwnXSAtIHVzZSB0aGlzIHpvbmUgaWYgbm8gb2Zmc2V0IGlzIHNwZWNpZmllZCBpbiB0aGUgaW5wdXQgc3RyaW5nIGl0c2VsZi4gV2lsbCBhbHNvIGNvbnZlcnQgdGhlIERhdGVUaW1lIHRvIHRoaXMgem9uZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCBpZiBpdCBzcGVjaWZpZXMgb25lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSBhIGxvY2FsZSBzdHJpbmcgdG8gdXNlIHdoZW4gcGFyc2luZy4gV2lsbCBhbHNvIHNldCB0aGUgRGF0ZVRpbWUgdG8gdGhpcyBsb2NhbGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlIHdoZW4gcGFyc2luZy4gV2lsbCBhbHNvIHNldCB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIHRvIHRoaXMgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNScpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MicpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyKzA2OjAwJylcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNC4zNDIgQW1lcmljYS9Mb3NfQW5nZWxlcycpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyIEFtZXJpY2EvTG9zX0FuZ2VsZXMnLCB7IHNldFpvbmU6IHRydWUgfSlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNC4zNDInLCB7IHpvbmU6ICdBbWVyaWNhL0xvc19BbmdlbGVzJyB9KVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcwOToxMjozNC4zNDInKVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tU1FMKHRleHQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IFt2YWxzLCBwYXJzZWRab25lXSA9IHBhcnNlU1FMKHRleHQpO1xuICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIFwiU1FMXCIsIHRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnZhbGlkIERhdGVUaW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uIC0gc2ltcGxlIHN0cmluZyBvZiB3aHkgdGhpcyBEYXRlVGltZSBpcyBpbnZhbGlkLiBTaG91bGQgbm90IGNvbnRhaW4gcGFyYW1ldGVycyBvciBhbnl0aGluZyBlbHNlIGRhdGEtZGVwZW5kZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXhwbGFuYXRpb249bnVsbF0gLSBsb25nZXIgZXhwbGFuYXRpb24sIG1heSBpbmNsdWRlIHBhcmFtZXRlcnMgYW5kIG90aGVyIHVzZWZ1bCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzdGF0aWMgaW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uID0gbnVsbCkge1xuICAgIGlmICghcmVhc29uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJuZWVkIHRvIHNwZWNpZnkgYSByZWFzb24gdGhlIERhdGVUaW1lIGlzIGludmFsaWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgaW52YWxpZCA9IHJlYXNvbiBpbnN0YW5jZW9mIEludmFsaWQgPyByZWFzb24gOiBuZXcgSW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uKTtcblxuICAgIGlmIChTZXR0aW5ncy50aHJvd09uSW52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWREYXRlVGltZUVycm9yKGludmFsaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IERhdGVUaW1lKHsgaW52YWxpZCB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gb2JqZWN0IGlzIGEgRGF0ZVRpbWUuIFdvcmtzIGFjcm9zcyBjb250ZXh0IGJvdW5kYXJpZXNcbiAgICogQHBhcmFtIHtvYmplY3R9IG9cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc0RhdGVUaW1lKG8pIHtcbiAgICByZXR1cm4gKG8gJiYgby5pc0x1eG9uRGF0ZVRpbWUpIHx8IGZhbHNlO1xuICB9XG5cbiAgLy8gSU5GT1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIHVuaXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gYSB1bml0IHN1Y2ggYXMgJ21pbnV0ZScgb3IgJ2RheSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNywgNCkuZ2V0KCdtb250aCcpOyAvLz0+IDdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNywgNCkuZ2V0KCdkYXknKTsgLy89PiA0XG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldCh1bml0KSB7XG4gICAgcmV0dXJuIHRoaXNbdW5pdF07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBEYXRlVGltZSBpcyB2YWxpZC4gSW52YWxpZCBEYXRlVGltZXMgb2NjdXIgd2hlbjpcbiAgICogKiBUaGUgRGF0ZVRpbWUgd2FzIGNyZWF0ZWQgZnJvbSBpbnZhbGlkIGNhbGVuZGFyIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSAxM3RoIG1vbnRoIG9yIEZlYnJ1YXJ5IDMwXG4gICAqICogVGhlIERhdGVUaW1lIHdhcyBjcmVhdGVkIGJ5IGFuIG9wZXJhdGlvbiBvbiBhbm90aGVyIGludmFsaWQgZGF0ZVxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIGdldCBpc1ZhbGlkKCkge1xuICAgIHJldHVybiB0aGlzLmludmFsaWQgPT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBlcnJvciBjb2RlIGlmIHRoaXMgRGF0ZVRpbWUgaXMgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgRGF0ZVRpbWUgaXMgdmFsaWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBpbnZhbGlkUmVhc29uKCkge1xuICAgIHJldHVybiB0aGlzLmludmFsaWQgPyB0aGlzLmludmFsaWQucmVhc29uIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIERhdGVUaW1lIGJlY2FtZSBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBEYXRlVGltZSBpcyB2YWxpZFxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGludmFsaWRFeHBsYW5hdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLmV4cGxhbmF0aW9uIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxvY2FsZSBvZiBhIERhdGVUaW1lLCBzdWNoICdlbi1HQicuIFRoZSBsb2NhbGUgaXMgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIERhdGVUaW1lXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbG9jYWxlKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmxvYy5sb2NhbGUgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbnVtYmVyaW5nIHN5c3RlbSBvZiBhIERhdGVUaW1lLCBzdWNoICdiZW5nJy4gVGhlIG51bWJlcmluZyBzeXN0ZW0gaXMgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIERhdGVUaW1lXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbnVtYmVyaW5nU3lzdGVtKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW0gOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgb3V0cHV0IGNhbGVuZGFyIG9mIGEgRGF0ZVRpbWUsIHN1Y2ggJ2lzbGFtaWMnLiBUaGUgb3V0cHV0IGNhbGVuZGFyIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEYXRlVGltZVxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG91dHB1dENhbGVuZGFyKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmxvYy5vdXRwdXRDYWxlbmRhciA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB0aW1lIHpvbmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgRGF0ZVRpbWUuXG4gICAqIEB0eXBlIHtab25lfVxuICAgKi9cbiAgZ2V0IHpvbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3pvbmU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSB0aW1lIHpvbmUuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgem9uZU5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuem9uZS5uYW1lIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHllYXJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnllYXIgLy89PiAyMDE3XG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgeWVhcigpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLnllYXIgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBxdWFydGVyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5xdWFydGVyIC8vPT4gMlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHF1YXJ0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IE1hdGguY2VpbCh0aGlzLmMubW9udGggLyAzKSA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1vbnRoICgxLTEyKS5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLm1vbnRoIC8vPT4gNVxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IG1vbnRoKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMubW9udGggOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkYXkgb2YgdGhlIG1vbnRoICgxLTMwaXNoKS5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLmRheSAvLz0+IDI1XG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgZGF5KCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMuZGF5IDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaG91ciBvZiB0aGUgZGF5ICgwLTIzKS5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDkpLmhvdXIgLy89PiA5XG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgaG91cigpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLmhvdXIgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtaW51dGUgb2YgdGhlIGhvdXIgKDAtNTkpLlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSwgOSwgMzApLm1pbnV0ZSAvLz0+IDMwXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgbWludXRlKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMubWludXRlIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc2Vjb25kIG9mIHRoZSBtaW51dGUgKDAtNTkpLlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSwgOSwgMzAsIDUyKS5zZWNvbmQgLy89PiA1MlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHNlY29uZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLnNlY29uZCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1pbGxpc2Vjb25kIG9mIHRoZSBzZWNvbmQgKDAtOTk5KS5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDksIDMwLCA1MiwgNjU0KS5taWxsaXNlY29uZCAvLz0+IDY1NFxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IG1pbGxpc2Vjb25kKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMubWlsbGlzZWNvbmQgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB3ZWVrIHllYXJcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDEyLCAzMSkud2Vla1llYXIgLy89PiAyMDE1XG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgd2Vla1llYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHBvc3NpYmx5Q2FjaGVkV2Vla0RhdGEodGhpcykud2Vla1llYXIgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB3ZWVrIG51bWJlciBvZiB0aGUgd2VlayB5ZWFyICgxLTUyaXNoKS5cbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS53ZWVrTnVtYmVyIC8vPT4gMjFcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCB3ZWVrTnVtYmVyKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBwb3NzaWJseUNhY2hlZFdlZWtEYXRhKHRoaXMpLndlZWtOdW1iZXIgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkYXkgb2YgdGhlIHdlZWsuXG4gICAqIDEgaXMgTW9uZGF5IGFuZCA3IGlzIFN1bmRheVxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMTEsIDMxKS53ZWVrZGF5IC8vPT4gNFxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHdlZWtkYXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHBvc3NpYmx5Q2FjaGVkV2Vla0RhdGEodGhpcykud2Vla2RheSA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG9yZGluYWwgKG1lYW5pbmcgdGhlIGRheSBvZiB0aGUgeWVhcilcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLm9yZGluYWwgLy89PiAxNDVcbiAgICogQHR5cGUge251bWJlcnxEYXRlVGltZX1cbiAgICovXG4gIGdldCBvcmRpbmFsKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBncmVnb3JpYW5Ub09yZGluYWwodGhpcy5jKS5vcmRpbmFsIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaHVtYW4gcmVhZGFibGUgc2hvcnQgbW9udGggbmFtZSwgc3VjaCBhcyAnT2N0Jy5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkubW9udGhTaG9ydCAvLz0+IE9jdFxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG1vbnRoU2hvcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEluZm8ubW9udGhzKFwic2hvcnRcIiwgeyBsb2NPYmo6IHRoaXMubG9jIH0pW3RoaXMubW9udGggLSAxXSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBodW1hbiByZWFkYWJsZSBsb25nIG1vbnRoIG5hbWUsIHN1Y2ggYXMgJ09jdG9iZXInLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMTAsIDMwKS5tb250aExvbmcgLy89PiBPY3RvYmVyXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbW9udGhMb25nKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbmZvLm1vbnRocyhcImxvbmdcIiwgeyBsb2NPYmo6IHRoaXMubG9jIH0pW3RoaXMubW9udGggLSAxXSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBodW1hbiByZWFkYWJsZSBzaG9ydCB3ZWVrZGF5LCBzdWNoIGFzICdNb24nLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMTAsIDMwKS53ZWVrZGF5U2hvcnQgLy89PiBNb25cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCB3ZWVrZGF5U2hvcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEluZm8ud2Vla2RheXMoXCJzaG9ydFwiLCB7IGxvY09iajogdGhpcy5sb2MgfSlbdGhpcy53ZWVrZGF5IC0gMV0gOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaHVtYW4gcmVhZGFibGUgbG9uZyB3ZWVrZGF5LCBzdWNoIGFzICdNb25kYXknLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMTAsIDMwKS53ZWVrZGF5TG9uZyAvLz0+IE1vbmRheVxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHdlZWtkYXlMb25nKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbmZvLndlZWtkYXlzKFwibG9uZ1wiLCB7IGxvY09iajogdGhpcy5sb2MgfSlbdGhpcy53ZWVrZGF5IC0gMV0gOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgVVRDIG9mZnNldCBvZiB0aGlzIERhdGVUaW1lIGluIG1pbnV0ZXNcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkub2Zmc2V0IC8vPT4gLTI0MFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS5vZmZzZXQgLy89PiAwXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgb2Zmc2V0KCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyArdGhpcy5vIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc2hvcnQgaHVtYW4gbmFtZSBmb3IgdGhlIHpvbmUncyBjdXJyZW50IG9mZnNldCwgZm9yIGV4YW1wbGUgXCJFU1RcIiBvciBcIkVEVFwiLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBvZmZzZXROYW1lU2hvcnQoKSB7XG4gICAgaWYgKHRoaXMuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuem9uZS5vZmZzZXROYW1lKHRoaXMudHMsIHtcbiAgICAgICAgZm9ybWF0OiBcInNob3J0XCIsXG4gICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbG9uZyBodW1hbiBuYW1lIGZvciB0aGUgem9uZSdzIGN1cnJlbnQgb2Zmc2V0LCBmb3IgZXhhbXBsZSBcIkVhc3Rlcm4gU3RhbmRhcmQgVGltZVwiIG9yIFwiRWFzdGVybiBEYXlsaWdodCBUaW1lXCIuXG4gICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG9mZnNldE5hbWVMb25nKCkge1xuICAgIGlmICh0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnpvbmUub2Zmc2V0TmFtZSh0aGlzLnRzLCB7XG4gICAgICAgIGZvcm1hdDogXCJsb25nXCIsXG4gICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB3aGV0aGVyIHRoaXMgem9uZSdzIG9mZnNldCBldmVyIGNoYW5nZXMsIGFzIGluIGEgRFNULlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIGdldCBpc09mZnNldEZpeGVkKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnpvbmUuaXNVbml2ZXJzYWwgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB3aGV0aGVyIHRoZSBEYXRlVGltZSBpcyBpbiBhIERTVC5cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNJbkRTVCgpIHtcbiAgICBpZiAodGhpcy5pc09mZnNldEZpeGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMub2Zmc2V0ID4gdGhpcy5zZXQoeyBtb250aDogMSB9KS5vZmZzZXQgfHwgdGhpcy5vZmZzZXQgPiB0aGlzLnNldCh7IG1vbnRoOiA1IH0pLm9mZnNldFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgRGF0ZVRpbWUgaXMgaW4gYSBsZWFwIHllYXIsIGZhbHNlIG90aGVyd2lzZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE2KS5pc0luTGVhcFllYXIgLy89PiB0cnVlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTMpLmlzSW5MZWFwWWVhciAvLz0+IGZhbHNlXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKi9cbiAgZ2V0IGlzSW5MZWFwWWVhcigpIHtcbiAgICByZXR1cm4gaXNMZWFwWWVhcih0aGlzLnllYXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoaXMgRGF0ZVRpbWUncyBtb250aFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE2LCAyKS5kYXlzSW5Nb250aCAvLz0+IDI5XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTYsIDMpLmRheXNJbk1vbnRoIC8vPT4gMzFcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBkYXlzSW5Nb250aCgpIHtcbiAgICByZXR1cm4gZGF5c0luTW9udGgodGhpcy55ZWFyLCB0aGlzLm1vbnRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGF5cyBpbiB0aGlzIERhdGVUaW1lJ3MgeWVhclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE2KS5kYXlzSW5ZZWFyIC8vPT4gMzY2XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTMpLmRheXNJblllYXIgLy89PiAzNjVcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBkYXlzSW5ZZWFyKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBkYXlzSW5ZZWFyKHRoaXMueWVhcikgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHdlZWtzIGluIHRoaXMgRGF0ZVRpbWUncyB5ZWFyXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDA0KS53ZWVrc0luV2Vla1llYXIgLy89PiA1M1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDEzKS53ZWVrc0luV2Vla1llYXIgLy89PiA1MlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHdlZWtzSW5XZWVrWWVhcigpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gd2Vla3NJbldlZWtZZWFyKHRoaXMud2Vla1llYXIpIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJlc29sdmVkIEludGwgb3B0aW9ucyBmb3IgdGhpcyBEYXRlVGltZS5cbiAgICogVGhpcyBpcyB1c2VmdWwgaW4gdW5kZXJzdGFuZGluZyB0aGUgYmVoYXZpb3Igb2YgZm9ybWF0dGluZyBtZXRob2RzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gdGhlIHNhbWUgb3B0aW9ucyBhcyB0b0xvY2FsZVN0cmluZ1xuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICByZXNvbHZlZExvY2FsZU9wdGlvbnMob3B0cyA9IHt9KSB7XG4gICAgY29uc3QgeyBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgY2FsZW5kYXIgfSA9IEZvcm1hdHRlci5jcmVhdGUoXG4gICAgICB0aGlzLmxvYy5jbG9uZShvcHRzKSxcbiAgICAgIG9wdHNcbiAgICApLnJlc29sdmVkT3B0aW9ucyh0aGlzKTtcbiAgICByZXR1cm4geyBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXI6IGNhbGVuZGFyIH07XG4gIH1cblxuICAvLyBUUkFOU0ZPUk1cblxuICAvKipcbiAgICogXCJTZXRcIiB0aGUgRGF0ZVRpbWUncyB6b25lIHRvIFVUQy4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxuICAgKlxuICAgKiBFcXVpdmFsZW50IHRvIHtAbGluayBEYXRlVGltZS5zZXRab25lfSgndXRjJylcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBvcHRpb25hbGx5LCBhbiBvZmZzZXQgZnJvbSBVVEMgaW4gbWludXRlc1xuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdHM9e31dIC0gb3B0aW9ucyB0byBwYXNzIHRvIGBzZXRab25lKClgXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgdG9VVEMob2Zmc2V0ID0gMCwgb3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0Wm9uZShGaXhlZE9mZnNldFpvbmUuaW5zdGFuY2Uob2Zmc2V0KSwgb3B0cyk7XG4gIH1cblxuICAvKipcbiAgICogXCJTZXRcIiB0aGUgRGF0ZVRpbWUncyB6b25lIHRvIHRoZSBob3N0J3MgbG9jYWwgem9uZS4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxuICAgKlxuICAgKiBFcXVpdmFsZW50IHRvIGBzZXRab25lKCdsb2NhbCcpYFxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHRvTG9jYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0Wm9uZShTZXR0aW5ncy5kZWZhdWx0Wm9uZSk7XG4gIH1cblxuICAvKipcbiAgICogXCJTZXRcIiB0aGUgRGF0ZVRpbWUncyB6b25lIHRvIHNwZWNpZmllZCB6b25lLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSBzZXR0ZXIga2VlcHMgdGhlIHVuZGVybHlpbmcgdGltZSB0aGUgc2FtZSAoYXMgaW4sIHRoZSBzYW1lIHRpbWVzdGFtcCksIGJ1dCB0aGUgbmV3IGluc3RhbmNlIHdpbGwgcmVwb3J0IGRpZmZlcmVudCBsb2NhbCB0aW1lcyBhbmQgY29uc2lkZXIgRFNUcyB3aGVuIG1ha2luZyBjb21wdXRhdGlvbnMsIGFzIHdpdGgge0BsaW5rIERhdGVUaW1lLnBsdXN9LiBZb3UgbWF5IHdpc2ggdG8gdXNlIHtAbGluayBEYXRlVGltZS50b0xvY2FsfSBhbmQge0BsaW5rIERhdGVUaW1lLnRvVVRDfSB3aGljaCBwcm92aWRlIHNpbXBsZSBjb252ZW5pZW5jZSB3cmFwcGVycyBmb3IgY29tbW9ubHkgdXNlZCB6b25lcy5cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW3pvbmU9J2xvY2FsJ10gLSBhIHpvbmUgaWRlbnRpZmllci4gQXMgYSBzdHJpbmcsIHRoYXQgY2FuIGJlIGFueSBJQU5BIHpvbmUgc3VwcG9ydGVkIGJ5IHRoZSBob3N0IGVudmlyb25tZW50LCBvciBhIGZpeGVkLW9mZnNldCBuYW1lIG9mIHRoZSBmb3JtICdVVEMrMycsIG9yIHRoZSBzdHJpbmdzICdsb2NhbCcgb3IgJ3V0YycuIFlvdSBtYXkgYWxzbyBzdXBwbHkgYW4gaW5zdGFuY2Ugb2YgYSB7QGxpbmsgRGF0ZVRpbWUuWm9uZX0gY2xhc3MuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmtlZXBMb2NhbFRpbWU9ZmFsc2VdIC0gSWYgdHJ1ZSwgYWRqdXN0IHRoZSB1bmRlcmx5aW5nIHRpbWUgc28gdGhhdCB0aGUgbG9jYWwgdGltZSBzdGF5cyB0aGUgc2FtZSwgYnV0IGluIHRoZSB0YXJnZXQgem9uZS4gWW91IHNob3VsZCByYXJlbHkgbmVlZCB0aGlzLlxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHNldFpvbmUoem9uZSwgeyBrZWVwTG9jYWxUaW1lID0gZmFsc2UsIGtlZXBDYWxlbmRhclRpbWUgPSBmYWxzZSB9ID0ge30pIHtcbiAgICB6b25lID0gbm9ybWFsaXplWm9uZSh6b25lLCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSk7XG4gICAgaWYgKHpvbmUuZXF1YWxzKHRoaXMuem9uZSkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSBpZiAoIXpvbmUuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQodW5zdXBwb3J0ZWRab25lKHpvbmUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG5ld1RTID0gdGhpcy50cztcbiAgICAgIGlmIChrZWVwTG9jYWxUaW1lIHx8IGtlZXBDYWxlbmRhclRpbWUpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0R3Vlc3MgPSB6b25lLm9mZnNldCh0aGlzLnRzKTtcbiAgICAgICAgY29uc3QgYXNPYmogPSB0aGlzLnRvT2JqZWN0KCk7XG4gICAgICAgIFtuZXdUU10gPSBvYmpUb1RTKGFzT2JqLCBvZmZzZXRHdWVzcywgem9uZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xvbmUodGhpcywgeyB0czogbmV3VFMsIHpvbmUgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvciBvdXRwdXRDYWxlbmRhci4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyAtIHRoZSBwcm9wZXJ0aWVzIHRvIHNldFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkucmVjb25maWd1cmUoeyBsb2NhbGU6ICdlbi1HQicgfSlcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICByZWNvbmZpZ3VyZSh7IGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhciB9ID0ge30pIHtcbiAgICBjb25zdCBsb2MgPSB0aGlzLmxvYy5jbG9uZSh7IGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhciB9KTtcbiAgICByZXR1cm4gY2xvbmUodGhpcywgeyBsb2MgfSk7XG4gIH1cblxuICAvKipcbiAgICogXCJTZXRcIiB0aGUgbG9jYWxlLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXG4gICAqIEp1c3QgYSBjb252ZW5pZW50IGFsaWFzIGZvciByZWNvbmZpZ3VyZSh7IGxvY2FsZSB9KVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkuc2V0TG9jYWxlKCdlbi1HQicpXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc2V0TG9jYWxlKGxvY2FsZSkge1xuICAgIHJldHVybiB0aGlzLnJlY29uZmlndXJlKHsgbG9jYWxlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIHZhbHVlcyBvZiBzcGVjaWZpZWQgdW5pdHMuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cbiAgICogWW91IGNhbiBvbmx5IHNldCB1bml0cyB3aXRoIHRoaXMgbWV0aG9kOyBmb3IgXCJzZXR0aW5nXCIgbWV0YWRhdGEsIHNlZSB7QGxpbmsgRGF0ZVRpbWUucmVjb25maWd1cmV9IGFuZCB7QGxpbmsgRGF0ZVRpbWUuc2V0Wm9uZX0uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXMgLSBhIG1hcHBpbmcgb2YgdW5pdHMgdG8gbnVtYmVyc1xuICAgKiBAZXhhbXBsZSBkdC5zZXQoeyB5ZWFyOiAyMDE3IH0pXG4gICAqIEBleGFtcGxlIGR0LnNldCh7IGhvdXI6IDgsIG1pbnV0ZTogMzAgfSlcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgd2Vla2RheTogNSB9KVxuICAgKiBAZXhhbXBsZSBkdC5zZXQoeyB5ZWFyOiAyMDA1LCBvcmRpbmFsOiAyMzQgfSlcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzZXQodmFsdWVzKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZU9iamVjdCh2YWx1ZXMsIG5vcm1hbGl6ZVVuaXQpLFxuICAgICAgc2V0dGluZ1dlZWtTdHVmZiA9XG4gICAgICAgICFpc1VuZGVmaW5lZChub3JtYWxpemVkLndlZWtZZWFyKSB8fFxuICAgICAgICAhaXNVbmRlZmluZWQobm9ybWFsaXplZC53ZWVrTnVtYmVyKSB8fFxuICAgICAgICAhaXNVbmRlZmluZWQobm9ybWFsaXplZC53ZWVrZGF5KSxcbiAgICAgIGNvbnRhaW5zT3JkaW5hbCA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLm9yZGluYWwpLFxuICAgICAgY29udGFpbnNHcmVnb3JZZWFyID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQueWVhciksXG4gICAgICBjb250YWluc0dyZWdvck1EID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQubW9udGgpIHx8ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLmRheSksXG4gICAgICBjb250YWluc0dyZWdvciA9IGNvbnRhaW5zR3JlZ29yWWVhciB8fCBjb250YWluc0dyZWdvck1ELFxuICAgICAgZGVmaW5pdGVXZWVrRGVmID0gbm9ybWFsaXplZC53ZWVrWWVhciB8fCBub3JtYWxpemVkLndlZWtOdW1iZXI7XG5cbiAgICBpZiAoKGNvbnRhaW5zR3JlZ29yIHx8IGNvbnRhaW5zT3JkaW5hbCkgJiYgZGVmaW5pdGVXZWVrRGVmKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IoXG4gICAgICAgIFwiQ2FuJ3QgbWl4IHdlZWtZZWFyL3dlZWtOdW1iZXIgdW5pdHMgd2l0aCB5ZWFyL21vbnRoL2RheSBvciBvcmRpbmFsc1wiXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjb250YWluc0dyZWdvck1EICYmIGNvbnRhaW5zT3JkaW5hbCkge1xuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yKFwiQ2FuJ3QgbWl4IG9yZGluYWwgZGF0ZXMgd2l0aCBtb250aC9kYXlcIik7XG4gICAgfVxuXG4gICAgbGV0IG1peGVkO1xuICAgIGlmIChzZXR0aW5nV2Vla1N0dWZmKSB7XG4gICAgICBtaXhlZCA9IHdlZWtUb0dyZWdvcmlhbih7IC4uLmdyZWdvcmlhblRvV2Vlayh0aGlzLmMpLCAuLi5ub3JtYWxpemVkIH0pO1xuICAgIH0gZWxzZSBpZiAoIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQub3JkaW5hbCkpIHtcbiAgICAgIG1peGVkID0gb3JkaW5hbFRvR3JlZ29yaWFuKHsgLi4uZ3JlZ29yaWFuVG9PcmRpbmFsKHRoaXMuYyksIC4uLm5vcm1hbGl6ZWQgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1peGVkID0geyAuLi50aGlzLnRvT2JqZWN0KCksIC4uLm5vcm1hbGl6ZWQgfTtcblxuICAgICAgLy8gaWYgd2UgZGlkbid0IHNldCB0aGUgZGF5IGJ1dCB3ZSBlbmRlZCB1cCBvbiBhbiBvdmVyZmxvdyBkYXRlLFxuICAgICAgLy8gdXNlIHRoZSBsYXN0IGRheSBvZiB0aGUgcmlnaHQgbW9udGhcbiAgICAgIGlmIChpc1VuZGVmaW5lZChub3JtYWxpemVkLmRheSkpIHtcbiAgICAgICAgbWl4ZWQuZGF5ID0gTWF0aC5taW4oZGF5c0luTW9udGgobWl4ZWQueWVhciwgbWl4ZWQubW9udGgpLCBtaXhlZC5kYXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IFt0cywgb10gPSBvYmpUb1RTKG1peGVkLCB0aGlzLm8sIHRoaXMuem9uZSk7XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdHMsIG8gfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgcGVyaW9kIG9mIHRpbWUgdG8gdGhpcyBEYXRlVGltZSBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWVcbiAgICpcbiAgICogQWRkaW5nIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBvciBtaWxsaXNlY29uZHMgaW5jcmVhc2VzIHRoZSB0aW1lc3RhbXAgYnkgdGhlIHJpZ2h0IG51bWJlciBvZiBtaWxsaXNlY29uZHMuIEFkZGluZyBkYXlzLCBtb250aHMsIG9yIHllYXJzIHNoaWZ0cyB0aGUgY2FsZW5kYXIsIGFjY291bnRpbmcgZm9yIERTVHMgYW5kIGxlYXAgeWVhcnMgYWxvbmcgdGhlIHdheS4gVGh1cywgYGR0LnBsdXMoeyBob3VyczogMjQgfSlgIG1heSByZXN1bHQgaW4gYSBkaWZmZXJlbnQgdGltZSB0aGFuIGBkdC5wbHVzKHsgZGF5czogMSB9KWAgaWYgdGhlcmUncyBhIERTVCBzaGlmdCBpbiBiZXR3ZWVuLlxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGFtb3VudCB0byBhZGQuIEVpdGhlciBhIEx1eG9uIER1cmF0aW9uLCBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIHRoZSBvYmplY3QgYXJndW1lbnQgdG8gRHVyYXRpb24uZnJvbU9iamVjdCgpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoMTIzKSAvL34+IGluIDEyMyBtaWxsaXNlY29uZHNcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IG1pbnV0ZXM6IDE1IH0pIC8vfj4gaW4gMTUgbWludXRlc1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5wbHVzKHsgZGF5czogMSB9KSAvL34+IHRoaXMgdGltZSB0b21vcnJvd1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5wbHVzKHsgZGF5czogLTEgfSkgLy9+PiB0aGlzIHRpbWUgeWVzdGVyZGF5XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoeyBob3VyczogMywgbWludXRlczogMTMgfSkgLy9+PiBpbiAzIGhyLCAxMyBtaW5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyhEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDMsIG1pbnV0ZXM6IDEzIH0pKSAvL34+IGluIDMgaHIsIDEzIG1pblxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHBsdXMoZHVyYXRpb24pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgY29uc3QgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbik7XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIGFkanVzdFRpbWUodGhpcywgZHVyKSk7XG4gIH1cblxuICAvKipcbiAgICogU3VidHJhY3QgYSBwZXJpb2Qgb2YgdGltZSB0byB0aGlzIERhdGVUaW1lIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBEYXRlVGltZVxuICAgKiBTZWUge0BsaW5rIERhdGVUaW1lLnBsdXN9XG4gICAqIEBwYXJhbSB7RHVyYXRpb258T2JqZWN0fG51bWJlcn0gZHVyYXRpb24gLSBUaGUgYW1vdW50IHRvIHN1YnRyYWN0LiBFaXRoZXIgYSBMdXhvbiBEdXJhdGlvbiwgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCB0aGUgb2JqZWN0IGFyZ3VtZW50IHRvIER1cmF0aW9uLmZyb21PYmplY3QoKVxuICAgQHJldHVybiB7RGF0ZVRpbWV9XG4gICovXG4gIG1pbnVzKGR1cmF0aW9uKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIGNvbnN0IGR1ciA9IGZyaWVuZGx5RHVyYXRpb24oZHVyYXRpb24pLm5lZ2F0ZSgpO1xuICAgIHJldHVybiBjbG9uZSh0aGlzLCBhZGp1c3RUaW1lKHRoaXMsIGR1cikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhpcyBEYXRlVGltZSB0byB0aGUgYmVnaW5uaW5nIG9mIGEgdW5pdCBvZiB0aW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIFRoZSB1bml0IHRvIGdvIHRvIHRoZSBiZWdpbm5pbmcgb2YuIENhbiBiZSAneWVhcicsICdxdWFydGVyJywgJ21vbnRoJywgJ3dlZWsnLCAnZGF5JywgJ2hvdXInLCAnbWludXRlJywgJ3NlY29uZCcsIG9yICdtaWxsaXNlY29uZCcuXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMpLnN0YXJ0T2YoJ21vbnRoJykudG9JU09EYXRlKCk7IC8vPT4gJzIwMTQtMDMtMDEnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMpLnN0YXJ0T2YoJ3llYXInKS50b0lTT0RhdGUoKTsgLy89PiAnMjAxNC0wMS0wMSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuc3RhcnRPZignd2VlaycpLnRvSVNPRGF0ZSgpOyAvLz0+ICcyMDE0LTAzLTAzJywgd2Vla3MgYWx3YXlzIHN0YXJ0IG9uIE1vbmRheXNcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMywgNSwgMzApLnN0YXJ0T2YoJ2RheScpLnRvSVNPVGltZSgpOyAvLz0+ICcwMDowMC4wMDAtMDU6MDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5zdGFydE9mKCdob3VyJykudG9JU09UaW1lKCk7IC8vPT4gJzA1OjAwOjAwLjAwMC0wNTowMCdcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzdGFydE9mKHVuaXQpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgY29uc3QgbyA9IHt9LFxuICAgICAgbm9ybWFsaXplZFVuaXQgPSBEdXJhdGlvbi5ub3JtYWxpemVVbml0KHVuaXQpO1xuICAgIHN3aXRjaCAobm9ybWFsaXplZFVuaXQpIHtcbiAgICAgIGNhc2UgXCJ5ZWFyc1wiOlxuICAgICAgICBvLm1vbnRoID0gMTtcbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcbiAgICAgIGNhc2UgXCJxdWFydGVyc1wiOlxuICAgICAgY2FzZSBcIm1vbnRoc1wiOlxuICAgICAgICBvLmRheSA9IDE7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICBjYXNlIFwid2Vla3NcIjpcbiAgICAgIGNhc2UgXCJkYXlzXCI6XG4gICAgICAgIG8uaG91ciA9IDA7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICBjYXNlIFwiaG91cnNcIjpcbiAgICAgICAgby5taW51dGUgPSAwO1xuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgY2FzZSBcIm1pbnV0ZXNcIjpcbiAgICAgICAgby5zZWNvbmQgPSAwO1xuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgY2FzZSBcInNlY29uZHNcIjpcbiAgICAgICAgby5taWxsaXNlY29uZCA9IDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIm1pbGxpc2Vjb25kc1wiOlxuICAgICAgICBicmVhaztcbiAgICAgIC8vIG5vIGRlZmF1bHQsIGludmFsaWQgdW5pdHMgdGhyb3cgaW4gbm9ybWFsaXplVW5pdCgpXG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRVbml0ID09PSBcIndlZWtzXCIpIHtcbiAgICAgIG8ud2Vla2RheSA9IDE7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRVbml0ID09PSBcInF1YXJ0ZXJzXCIpIHtcbiAgICAgIGNvbnN0IHEgPSBNYXRoLmNlaWwodGhpcy5tb250aCAvIDMpO1xuICAgICAgby5tb250aCA9IChxIC0gMSkgKiAzICsgMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZXQobyk7XG4gIH1cblxuICAvKipcbiAgICogXCJTZXRcIiB0aGlzIERhdGVUaW1lIHRvIHRoZSBlbmQgKG1lYW5pbmcgdGhlIGxhc3QgbWlsbGlzZWNvbmQpIG9mIGEgdW5pdCBvZiB0aW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gVGhlIHVuaXQgdG8gZ28gdG8gdGhlIGVuZCBvZi4gQ2FuIGJlICd5ZWFyJywgJ3F1YXJ0ZXInLCAnbW9udGgnLCAnd2VlaycsICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJywgb3IgJ21pbGxpc2Vjb25kJy5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuZW5kT2YoJ21vbnRoJykudG9JU08oKTsgLy89PiAnMjAxNC0wMy0zMVQyMzo1OTo1OS45OTktMDU6MDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMpLmVuZE9mKCd5ZWFyJykudG9JU08oKTsgLy89PiAnMjAxNC0xMi0zMVQyMzo1OTo1OS45OTktMDU6MDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMpLmVuZE9mKCd3ZWVrJykudG9JU08oKTsgLy8gPT4gJzIwMTQtMDMtMDlUMjM6NTk6NTkuOTk5LTA1OjAwJywgd2Vla3Mgc3RhcnQgb24gTW9uZGF5c1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzLCA1LCAzMCkuZW5kT2YoJ2RheScpLnRvSVNPKCk7IC8vPT4gJzIwMTQtMDMtMDNUMjM6NTk6NTkuOTk5LTA1OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzLCA1LCAzMCkuZW5kT2YoJ2hvdXInKS50b0lTTygpOyAvLz0+ICcyMDE0LTAzLTAzVDA1OjU5OjU5Ljk5OS0wNTowMCdcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBlbmRPZih1bml0KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZFxuICAgICAgPyB0aGlzLnBsdXMoeyBbdW5pdF06IDEgfSlcbiAgICAgICAgICAuc3RhcnRPZih1bml0KVxuICAgICAgICAgIC5taW51cygxKVxuICAgICAgOiB0aGlzO1xuICB9XG5cbiAgLy8gT1VUUFVUXG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy5cbiAgICogKipZb3UgbWF5IG5vdCB3YW50IHRoaXMuKiogU2VlIHtAbGluayBEYXRlVGltZS50b0xvY2FsZVN0cmluZ30gZm9yIGEgbW9yZSBmbGV4aWJsZSBmb3JtYXR0aW5nIHRvb2wuIEZvciBhIHRhYmxlIG9mIHRva2VucyBhbmQgdGhlaXIgaW50ZXJwcmV0YXRpb25zLCBzZWUgW2hlcmVdKGh0dHBzOi8vbW9tZW50LmdpdGh1Yi5pby9sdXhvbi8jL2Zvcm1hdHRpbmc/aWQ9dGFibGUtb2YtdG9rZW5zKS5cbiAgICogRGVmYXVsdHMgdG8gZW4tVVMgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZCwgcmVnYXJkbGVzcyBvZiB0aGUgc3lzdGVtJ3MgbG9jYWxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm10IC0gdGhlIGZvcm1hdCBzdHJpbmdcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRzIHRvIG92ZXJyaWRlIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgb24gdGhpcyBEYXRlVGltZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0Zvcm1hdCgneXl5eSBMTEwgZGQnKSAvLz0+ICcyMDE3IEFwciAyMidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkuc2V0TG9jYWxlKCdmcicpLnRvRm9ybWF0KCd5eXl5IExMTCBkZCcpIC8vPT4gJzIwMTcgYXZyLiAyMidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9Gb3JtYXQoJ3l5eXkgTExMIGRkJywgeyBsb2NhbGU6IFwiZnJcIiB9KSAvLz0+ICcyMDE3IGF2ci4gMjInXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvRm9ybWF0KFwiSEggJ2hvdXJzIGFuZCcgbW0gJ21pbnV0ZXMnXCIpIC8vPT4gJzIwIGhvdXJzIGFuZCA1NSBtaW51dGVzJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0Zvcm1hdChmbXQsIG9wdHMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRcbiAgICAgID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5yZWRlZmF1bHRUb0VOKG9wdHMpKS5mb3JtYXREYXRlVGltZUZyb21TdHJpbmcodGhpcywgZm10KVxuICAgICAgOiBJTlZBTElEO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsb2NhbGl6ZWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGlzIGRhdGUuIEFjY2VwdHMgdGhlIHNhbWUgb3B0aW9ucyBhcyB0aGUgSW50bC5EYXRlVGltZUZvcm1hdCBjb25zdHJ1Y3RvciBhbmQgYW55IHByZXNldHMgZGVmaW5lZCBieSBMdXhvbiwgc3VjaCBhcyBgRGF0ZVRpbWUuREFURV9GVUxMYCBvciBgRGF0ZVRpbWUuVElNRV9TSU1QTEVgLlxuICAgKiBUaGUgZXhhY3QgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgYnJvd3Nlci1zcGVjaWZpYywgYnV0IGluIGdlbmVyYWwgaXQgd2lsbCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgcmVwcmVzZW50YXRpb25cbiAgICogb2YgdGhlIERhdGVUaW1lIGluIHRoZSBhc3NpZ25lZCBsb2NhbGUuXG4gICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVUaW1lRm9ybWF0XG4gICAqIEBwYXJhbSBmb3JtYXRPcHRzIHtPYmplY3R9IC0gSW50bC5EYXRlVGltZUZvcm1hdCBjb25zdHJ1Y3RvciBvcHRpb25zIGFuZCBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRzIHRvIG92ZXJyaWRlIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgb24gdGhpcyBEYXRlVGltZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0xvY2FsZVN0cmluZygpOyAvLz0+IDQvMjAvMjAxN1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5zZXRMb2NhbGUoJ2VuLWdiJykudG9Mb2NhbGVTdHJpbmcoKTsgLy89PiAnMjAvMDQvMjAxNydcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9Mb2NhbGVTdHJpbmcoeyBsb2NhbGU6ICdlbi1nYicgfSk7IC8vPT4gJzIwLzA0LzIwMTcnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLkRBVEVfRlVMTCk7IC8vPT4gJ0FwcmlsIDIwLCAyMDE3J1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0xvY2FsZVN0cmluZyhEYXRlVGltZS5USU1FX1NJTVBMRSk7IC8vPT4gJzExOjMyIEFNJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0xvY2FsZVN0cmluZyhEYXRlVGltZS5EQVRFVElNRV9TSE9SVCk7IC8vPT4gJzQvMjAvMjAxNywgMTE6MzIgQU0nXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKHsgd2Vla2RheTogJ2xvbmcnLCBtb250aDogJ2xvbmcnLCBkYXk6ICcyLWRpZ2l0JyB9KTsgLy89PiAnVGh1cnNkYXksIEFwcmlsIDIwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0xvY2FsZVN0cmluZyh7IHdlZWtkYXk6ICdzaG9ydCcsIG1vbnRoOiAnc2hvcnQnLCBkYXk6ICcyLWRpZ2l0JywgaG91cjogJzItZGlnaXQnLCBtaW51dGU6ICcyLWRpZ2l0JyB9KTsgLy89PiAnVGh1LCBBcHIgMjAsIDExOjI3IEFNJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0xvY2FsZVN0cmluZyh7IGhvdXI6ICcyLWRpZ2l0JywgbWludXRlOiAnMi1kaWdpdCcsIGhvdXJDeWNsZTogJ2gyMycgfSk7IC8vPT4gJzExOjMyJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0xvY2FsZVN0cmluZyhmb3JtYXRPcHRzID0gRm9ybWF0cy5EQVRFX1NIT1JULCBvcHRzID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkXG4gICAgICA/IEZvcm1hdHRlci5jcmVhdGUodGhpcy5sb2MuY2xvbmUob3B0cyksIGZvcm1hdE9wdHMpLmZvcm1hdERhdGVUaW1lKHRoaXMpXG4gICAgICA6IElOVkFMSUQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBmb3JtYXQgXCJwYXJ0c1wiLCBtZWFuaW5nIGluZGl2aWR1YWwgdG9rZW5zIGFsb25nIHdpdGggbWV0YWRhdGEuIFRoaXMgaXMgYWxsb3dzIGNhbGxlcnMgdG8gcG9zdC1wcm9jZXNzIGluZGl2aWR1YWwgc2VjdGlvbnMgb2YgdGhlIGZvcm1hdHRlZCBvdXRwdXQuXG4gICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVUaW1lRm9ybWF0L2Zvcm1hdFRvUGFydHNcbiAgICogQHBhcmFtIG9wdHMge09iamVjdH0gLSBJbnRsLkRhdGVUaW1lRm9ybWF0IGNvbnN0cnVjdG9yIG9wdGlvbnMsIHNhbWUgYXMgYHRvTG9jYWxlU3RyaW5nYC5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9Mb2NhbGVQYXJ0cygpOyAvLz0+IFtcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICdkYXknLCB2YWx1ZTogJzI1JyB9LFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAgIHsgdHlwZTogJ2xpdGVyYWwnLCB2YWx1ZTogJy8nIH0sXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAnbW9udGgnLCB2YWx1ZTogJzA1JyB9LFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAgIHsgdHlwZTogJ2xpdGVyYWwnLCB2YWx1ZTogJy8nIH0sXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAneWVhcicsIHZhbHVlOiAnMTk4MicgfVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiBdXG4gICAqL1xuICB0b0xvY2FsZVBhcnRzKG9wdHMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRcbiAgICAgID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShvcHRzKSwgb3B0cykuZm9ybWF0RGF0ZVRpbWVQYXJ0cyh0aGlzKVxuICAgICAgOiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc01pbGxpc2Vjb25kcz1mYWxzZV0gLSBleGNsdWRlIG1pbGxpc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc3VwcHJlc3NTZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZU9mZnNldD10cnVlXSAtIGluY2x1ZGUgdGhlIG9mZnNldCwgc3VjaCBhcyAnWicgb3IgJy0wNDowMCdcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmZvcm1hdD0nZXh0ZW5kZWQnXSAtIGNob29zZSBiZXR3ZWVuIHRoZSBiYXNpYyBhbmQgZXh0ZW5kZWQgZm9ybWF0XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygxOTgyLCA1LCAyNSkudG9JU08oKSAvLz0+ICcxOTgyLTA1LTI1VDAwOjAwOjAwLjAwMFonXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvSVNPKCkgLy89PiAnMjAxNy0wNC0yMlQyMDo0NzowNS4zMzUtMDQ6MDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvSVNPKHsgaW5jbHVkZU9mZnNldDogZmFsc2UgfSkgLy89PiAnMjAxNy0wNC0yMlQyMDo0NzowNS4zMzUnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvSVNPKHsgZm9ybWF0OiAnYmFzaWMnIH0pIC8vPT4gJzIwMTcwNDIyVDIwNDcwNS4zMzUtMDQwMCdcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU08ob3B0cyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBgJHt0aGlzLnRvSVNPRGF0ZShvcHRzKX1UJHt0aGlzLnRvSVNPVGltZShvcHRzKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lJ3MgZGF0ZSBjb21wb25lbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5mb3JtYXQ9J2V4dGVuZGVkJ10gLSBjaG9vc2UgYmV0d2VlbiB0aGUgYmFzaWMgYW5kIGV4dGVuZGVkIGZvcm1hdFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPRGF0ZSgpIC8vPT4gJzE5ODItMDUtMjUnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygxOTgyLCA1LCAyNSkudG9JU09EYXRlKHsgZm9ybWF0OiAnYmFzaWMnIH0pIC8vPT4gJzE5ODIwNTI1J1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0lTT0RhdGUoeyBmb3JtYXQgPSBcImV4dGVuZGVkXCIgfSA9IHt9KSB7XG4gICAgbGV0IGZtdCA9IGZvcm1hdCA9PT0gXCJiYXNpY1wiID8gXCJ5eXl5TU1kZFwiIDogXCJ5eXl5LU1NLWRkXCI7XG4gICAgaWYgKHRoaXMueWVhciA+IDk5OTkpIHtcbiAgICAgIGZtdCA9IFwiK1wiICsgZm10O1xuICAgIH1cblxuICAgIHJldHVybiB0b1RlY2hGb3JtYXQodGhpcywgZm10KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSdzIHdlZWsgZGF0ZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPV2Vla0RhdGUoKSAvLz0+ICcxOTgyLVcyMS0yJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0lTT1dlZWtEYXRlKCkge1xuICAgIHJldHVybiB0b1RlY2hGb3JtYXQodGhpcywgXCJra2trLSdXJ1dXLWNcIik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUncyB0aW1lIGNvbXBvbmVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc01pbGxpc2Vjb25kcz1mYWxzZV0gLSBleGNsdWRlIG1pbGxpc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc3VwcHJlc3NTZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZU9mZnNldD10cnVlXSAtIGluY2x1ZGUgdGhlIG9mZnNldCwgc3VjaCBhcyAnWicgb3IgJy0wNDowMCdcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlUHJlZml4PWZhbHNlXSAtIGluY2x1ZGUgdGhlIGBUYCBwcmVmaXhcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmZvcm1hdD0nZXh0ZW5kZWQnXSAtIGNob29zZSBiZXR3ZWVuIHRoZSBiYXNpYyBhbmQgZXh0ZW5kZWQgZm9ybWF0XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpLnNldCh7IGhvdXI6IDcsIG1pbnV0ZTogMzQgfSkudG9JU09UaW1lKCkgLy89PiAnMDc6MzQ6MTkuMzYxWidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkuc2V0KHsgaG91cjogNywgbWludXRlOiAzNCwgc2Vjb25kczogMCwgbWlsbGlzZWNvbmRzOiAwIH0pLnRvSVNPVGltZSh7IHN1cHByZXNzU2Vjb25kczogdHJ1ZSB9KSAvLz0+ICcwNzozNFonXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpLnNldCh7IGhvdXI6IDcsIG1pbnV0ZTogMzQgfSkudG9JU09UaW1lKHsgZm9ybWF0OiAnYmFzaWMnIH0pIC8vPT4gJzA3MzQxOS4zNjFaJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS5zZXQoeyBob3VyOiA3LCBtaW51dGU6IDM0IH0pLnRvSVNPVGltZSh7IGluY2x1ZGVQcmVmaXg6IHRydWUgfSkgLy89PiAnVDA3OjM0OjE5LjM2MVonXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvSVNPVGltZSh7XG4gICAgc3VwcHJlc3NNaWxsaXNlY29uZHMgPSBmYWxzZSxcbiAgICBzdXBwcmVzc1NlY29uZHMgPSBmYWxzZSxcbiAgICBpbmNsdWRlT2Zmc2V0ID0gdHJ1ZSxcbiAgICBpbmNsdWRlUHJlZml4ID0gZmFsc2UsXG4gICAgZm9ybWF0ID0gXCJleHRlbmRlZFwiLFxuICB9ID0ge30pIHtcbiAgICByZXR1cm4gdG9UZWNoVGltZUZvcm1hdCh0aGlzLCB7XG4gICAgICBzdXBwcmVzc1NlY29uZHMsXG4gICAgICBzdXBwcmVzc01pbGxpc2Vjb25kcyxcbiAgICAgIGluY2x1ZGVPZmZzZXQsXG4gICAgICBpbmNsdWRlUHJlZml4LFxuICAgICAgZm9ybWF0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gUkZDIDI4MjItY29tcGF0aWJsZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSwgYWx3YXlzIGluIFVUQ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMpLnRvUkZDMjgyMigpIC8vPT4gJ1N1biwgMTMgSnVsIDIwMTQgMDA6MDA6MDAgKzAwMDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDcsIDEzKS50b1JGQzI4MjIoKSAvLz0+ICdTdW4sIDEzIEp1bCAyMDE0IDAwOjAwOjAwIC0wNDAwJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b1JGQzI4MjIoKSB7XG4gICAgcmV0dXJuIHRvVGVjaEZvcm1hdCh0aGlzLCBcIkVFRSwgZGQgTExMIHl5eXkgSEg6bW06c3MgWlpaXCIsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBIVFRQIGhlYWRlcnMuXG4gICAqIFNwZWNpZmljYWxseSwgdGhlIHN0cmluZyBjb25mb3JtcyB0byBSRkMgMTEyMy5cbiAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMzLmh0bWwjc2VjMy4zLjFcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTQsIDcsIDEzKS50b0hUVFAoKSAvLz0+ICdTdW4sIDEzIEp1bCAyMDE0IDAwOjAwOjAwIEdNVCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTQsIDcsIDEzLCAxOSkudG9IVFRQKCkgLy89PiAnU3VuLCAxMyBKdWwgMjAxNCAxOTowMDowMCBHTVQnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvSFRUUCgpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMudG9VVEMoKSwgXCJFRUUsIGRkIExMTCB5eXl5IEhIOm1tOnNzICdHTVQnXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIFNRTCBEYXRlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMykudG9TUUxEYXRlKCkgLy89PiAnMjAxNC0wNy0xMydcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9TUUxEYXRlKCkge1xuICAgIHJldHVybiB0b1RlY2hGb3JtYXQodGhpcywgXCJ5eXl5LU1NLWRkXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIFNRTCBUaW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVab25lPWZhbHNlXSAtIGluY2x1ZGUgdGhlIHpvbmUsIHN1Y2ggYXMgJ0FtZXJpY2EvTmV3X1lvcmsnLiBPdmVycmlkZXMgaW5jbHVkZU9mZnNldC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS50b1NRTCgpIC8vPT4gJzA1OjE1OjE2LjM0NSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9TUUwoKSAvLz0+ICcwNToxNToxNi4zNDUgLTA0OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b1NRTCh7IGluY2x1ZGVPZmZzZXQ6IGZhbHNlIH0pIC8vPT4gJzA1OjE1OjE2LjM0NSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9TUUwoeyBpbmNsdWRlWm9uZTogZmFsc2UgfSkgLy89PiAnMDU6MTU6MTYuMzQ1IEFtZXJpY2EvTmV3X1lvcmsnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvU1FMVGltZSh7IGluY2x1ZGVPZmZzZXQgPSB0cnVlLCBpbmNsdWRlWm9uZSA9IGZhbHNlIH0gPSB7fSkge1xuICAgIHJldHVybiB0b1RlY2hUaW1lRm9ybWF0KHRoaXMsIHtcbiAgICAgIGluY2x1ZGVPZmZzZXQsXG4gICAgICBpbmNsdWRlWm9uZSxcbiAgICAgIHNwYWNlWm9uZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBTUUwgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZVpvbmU9ZmFsc2VdIC0gaW5jbHVkZSB0aGUgem9uZSwgc3VjaCBhcyAnQW1lcmljYS9OZXdfWW9yaycuIE92ZXJyaWRlcyBpbmNsdWRlT2Zmc2V0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVPZmZzZXQ9dHJ1ZV0gLSBpbmNsdWRlIHRoZSBvZmZzZXQsIHN1Y2ggYXMgJ1onIG9yICctMDQ6MDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMykudG9TUUwoKSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCBaJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCA3LCAxMykudG9TUUwoKSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCAtMDQ6MDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDcsIDEzKS50b1NRTCh7IGluY2x1ZGVPZmZzZXQ6IGZhbHNlIH0pIC8vPT4gJzIwMTQtMDctMTMgMDA6MDA6MDAuMDAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCA3LCAxMykudG9TUUwoeyBpbmNsdWRlWm9uZTogdHJ1ZSB9KSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCBBbWVyaWNhL05ld19Zb3JrJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b1NRTChvcHRzID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3RoaXMudG9TUUxEYXRlKCl9ICR7dGhpcy50b1NRTFRpbWUob3B0cyl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIGRlYnVnZ2luZ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50b0lTTygpIDogSU5WQUxJRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlcG9jaCBtaWxsaXNlY29uZHMgb2YgdGhpcyBEYXRlVGltZS4gQWxpYXMgb2Yge0BsaW5rIERhdGVUaW1lLnRvTWlsbGlzfVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICB2YWx1ZU9mKCkge1xuICAgIHJldHVybiB0aGlzLnRvTWlsbGlzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXBvY2ggbWlsbGlzZWNvbmRzIG9mIHRoaXMgRGF0ZVRpbWUuXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIHRvTWlsbGlzKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnRzIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGVwb2NoIHNlY29uZHMgb2YgdGhpcyBEYXRlVGltZS5cbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgdG9TZWNvbmRzKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnRzIC8gMTAwMCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBKU09OLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9JU08oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgQlNPTiBzZXJpYWxpemFibGUgZXF1aXZhbGVudCB0byB0aGlzIERhdGVUaW1lLlxuICAgKiBAcmV0dXJuIHtEYXRlfVxuICAgKi9cbiAgdG9CU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvSlNEYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEphdmFTY3JpcHQgb2JqZWN0IHdpdGggdGhpcyBEYXRlVGltZSdzIHllYXIsIG1vbnRoLCBkYXksIGFuZCBzbyBvbi5cbiAgICogQHBhcmFtIG9wdHMgLSBvcHRpb25zIGZvciBnZW5lcmF0aW5nIHRoZSBvYmplY3RcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlQ29uZmlnPWZhbHNlXSAtIGluY2x1ZGUgY29uZmlndXJhdGlvbiBhdHRyaWJ1dGVzIGluIHRoZSBvdXRwdXRcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9PYmplY3QoKSAvLz0+IHsgeWVhcjogMjAxNywgbW9udGg6IDQsIGRheTogMjIsIGhvdXI6IDIwLCBtaW51dGU6IDQ5LCBzZWNvbmQ6IDQyLCBtaWxsaXNlY29uZDogMjY4IH1cbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgdG9PYmplY3Qob3B0cyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB7fTtcblxuICAgIGNvbnN0IGJhc2UgPSB7IC4uLnRoaXMuYyB9O1xuXG4gICAgaWYgKG9wdHMuaW5jbHVkZUNvbmZpZykge1xuICAgICAgYmFzZS5vdXRwdXRDYWxlbmRhciA9IHRoaXMub3V0cHV0Q2FsZW5kYXI7XG4gICAgICBiYXNlLm51bWJlcmluZ1N5c3RlbSA9IHRoaXMubG9jLm51bWJlcmluZ1N5c3RlbTtcbiAgICAgIGJhc2UubG9jYWxlID0gdGhpcy5sb2MubG9jYWxlO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgSmF2YVNjcmlwdCBEYXRlIGVxdWl2YWxlbnQgdG8gdGhpcyBEYXRlVGltZS5cbiAgICogQHJldHVybiB7RGF0ZX1cbiAgICovXG4gIHRvSlNEYXRlKCkge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLmlzVmFsaWQgPyB0aGlzLnRzIDogTmFOKTtcbiAgfVxuXG4gIC8vIENPTVBBUkVcblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIERhdGVUaW1lcyBhcyBhIER1cmF0aW9uLlxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBvdGhlckRhdGVUaW1lIC0gdGhlIERhdGVUaW1lIHRvIGNvbXBhcmUgdGhpcyBvbmUgdG9cbiAgICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IFt1bml0PVsnbWlsbGlzZWNvbmRzJ11dIC0gdGhlIHVuaXQgb3IgYXJyYXkgb2YgdW5pdHMgKHN1Y2ggYXMgJ2hvdXJzJyBvciAnZGF5cycpIHRvIGluY2x1ZGUgaW4gdGhlIGR1cmF0aW9uLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIHRoZSBEdXJhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcbiAgICogQGV4YW1wbGVcbiAgICogdmFyIGkxID0gRGF0ZVRpbWUuZnJvbUlTTygnMTk4Mi0wNS0yNVQwOTo0NScpLFxuICAgKiAgICAgaTIgPSBEYXRlVGltZS5mcm9tSVNPKCcxOTgzLTEwLTE0VDEwOjMwJyk7XG4gICAqIGkyLmRpZmYoaTEpLnRvT2JqZWN0KCkgLy89PiB7IG1pbGxpc2Vjb25kczogNDM4MDc1MDAwMDAgfVxuICAgKiBpMi5kaWZmKGkxLCAnaG91cnMnKS50b09iamVjdCgpIC8vPT4geyBob3VyczogMTIxNjguNzUgfVxuICAgKiBpMi5kaWZmKGkxLCBbJ21vbnRocycsICdkYXlzJ10pLnRvT2JqZWN0KCkgLy89PiB7IG1vbnRoczogMTYsIGRheXM6IDE5LjAzMTI1IH1cbiAgICogaTIuZGlmZihpMSwgWydtb250aHMnLCAnZGF5cycsICdob3VycyddKS50b09iamVjdCgpIC8vPT4geyBtb250aHM6IDE2LCBkYXlzOiAxOSwgaG91cnM6IDAuNzUgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIGRpZmYob3RoZXJEYXRlVGltZSwgdW5pdCA9IFwibWlsbGlzZWNvbmRzXCIsIG9wdHMgPSB7fSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkIHx8ICFvdGhlckRhdGVUaW1lLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEdXJhdGlvbi5pbnZhbGlkKFwiY3JlYXRlZCBieSBkaWZmaW5nIGFuIGludmFsaWQgRGF0ZVRpbWVcIik7XG4gICAgfVxuXG4gICAgY29uc3QgZHVyT3B0cyA9IHsgbG9jYWxlOiB0aGlzLmxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtOiB0aGlzLm51bWJlcmluZ1N5c3RlbSwgLi4ub3B0cyB9O1xuXG4gICAgY29uc3QgdW5pdHMgPSBtYXliZUFycmF5KHVuaXQpLm1hcChEdXJhdGlvbi5ub3JtYWxpemVVbml0KSxcbiAgICAgIG90aGVySXNMYXRlciA9IG90aGVyRGF0ZVRpbWUudmFsdWVPZigpID4gdGhpcy52YWx1ZU9mKCksXG4gICAgICBlYXJsaWVyID0gb3RoZXJJc0xhdGVyID8gdGhpcyA6IG90aGVyRGF0ZVRpbWUsXG4gICAgICBsYXRlciA9IG90aGVySXNMYXRlciA/IG90aGVyRGF0ZVRpbWUgOiB0aGlzLFxuICAgICAgZGlmZmVkID0gZGlmZihlYXJsaWVyLCBsYXRlciwgdW5pdHMsIGR1ck9wdHMpO1xuXG4gICAgcmV0dXJuIG90aGVySXNMYXRlciA/IGRpZmZlZC5uZWdhdGUoKSA6IGRpZmZlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIERhdGVUaW1lIGFuZCByaWdodCBub3cuXG4gICAqIFNlZSB7QGxpbmsgRGF0ZVRpbWUuZGlmZn1cbiAgICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IFt1bml0PVsnbWlsbGlzZWNvbmRzJ11dIC0gdGhlIHVuaXQgb3IgdW5pdHMgdW5pdHMgKHN1Y2ggYXMgJ2hvdXJzJyBvciAnZGF5cycpIHRvIGluY2x1ZGUgaW4gdGhlIGR1cmF0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgdGhlIER1cmF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5jb252ZXJzaW9uQWNjdXJhY3k9J2Nhc3VhbCddIC0gdGhlIGNvbnZlcnNpb24gc3lzdGVtIHRvIHVzZVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIGRpZmZOb3codW5pdCA9IFwibWlsbGlzZWNvbmRzXCIsIG9wdHMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmRpZmYoRGF0ZVRpbWUubm93KCksIHVuaXQsIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBJbnRlcnZhbCBzcGFubmluZyBiZXR3ZWVuIHRoaXMgRGF0ZVRpbWUgYW5kIGFub3RoZXIgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXJEYXRlVGltZSAtIHRoZSBvdGhlciBlbmQgcG9pbnQgb2YgdGhlIEludGVydmFsXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKi9cbiAgdW50aWwob3RoZXJEYXRlVGltZSkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHRoaXMsIG90aGVyRGF0ZVRpbWUpIDogdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIERhdGVUaW1lIGlzIGluIHRoZSBzYW1lIHVuaXQgb2YgdGltZSBhcyBhbm90aGVyIERhdGVUaW1lLlxuICAgKiBIaWdoZXItb3JkZXIgdW5pdHMgbXVzdCBhbHNvIGJlIGlkZW50aWNhbCBmb3IgdGhpcyBmdW5jdGlvbiB0byByZXR1cm4gYHRydWVgLlxuICAgKiBOb3RlIHRoYXQgdGltZSB6b25lcyBhcmUgKippZ25vcmVkKiogaW4gdGhpcyBjb21wYXJpc29uLCB3aGljaCBjb21wYXJlcyB0aGUgKipsb2NhbCoqIGNhbGVuZGFyIHRpbWUuIFVzZSB7QGxpbmsgRGF0ZVRpbWUuc2V0Wm9uZX0gdG8gY29udmVydCBvbmUgb2YgdGhlIGRhdGVzIGlmIG5lZWRlZC5cbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXJEYXRlVGltZSAtIHRoZSBvdGhlciBEYXRlVGltZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY2hlY2sgc2FtZW5lc3Mgb25cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkuaGFzU2FtZShvdGhlckRULCAnZGF5Jyk7IC8vfj4gdHJ1ZSBpZiBvdGhlckRUIGlzIGluIHRoZSBzYW1lIGN1cnJlbnQgY2FsZW5kYXIgZGF5XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBoYXNTYW1lKG90aGVyRGF0ZVRpbWUsIHVuaXQpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgaW5wdXRNcyA9IG90aGVyRGF0ZVRpbWUudmFsdWVPZigpO1xuICAgIGNvbnN0IG90aGVyWm9uZURhdGVUaW1lID0gdGhpcy5zZXRab25lKG90aGVyRGF0ZVRpbWUuem9uZSwgeyBrZWVwTG9jYWxUaW1lOiB0cnVlIH0pO1xuICAgIHJldHVybiBvdGhlclpvbmVEYXRlVGltZS5zdGFydE9mKHVuaXQpIDw9IGlucHV0TXMgJiYgaW5wdXRNcyA8PSBvdGhlclpvbmVEYXRlVGltZS5lbmRPZih1bml0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFcXVhbGl0eSBjaGVja1xuICAgKiBUd28gRGF0ZVRpbWVzIGFyZSBlcXVhbCBpZmYgdGhleSByZXByZXNlbnQgdGhlIHNhbWUgbWlsbGlzZWNvbmQsIGhhdmUgdGhlIHNhbWUgem9uZSBhbmQgbG9jYXRpb24sIGFuZCBhcmUgYm90aCB2YWxpZC5cbiAgICogVG8gY29tcGFyZSBqdXN0IHRoZSBtaWxsaXNlY29uZCB2YWx1ZXMsIHVzZSBgK2R0MSA9PT0gK2R0MmAuXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IG90aGVyIC0gdGhlIG90aGVyIERhdGVUaW1lXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBlcXVhbHMob3RoZXIpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5pc1ZhbGlkICYmXG4gICAgICBvdGhlci5pc1ZhbGlkICYmXG4gICAgICB0aGlzLnZhbHVlT2YoKSA9PT0gb3RoZXIudmFsdWVPZigpICYmXG4gICAgICB0aGlzLnpvbmUuZXF1YWxzKG90aGVyLnpvbmUpICYmXG4gICAgICB0aGlzLmxvYy5lcXVhbHMob3RoZXIubG9jKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHRoaXMgdGltZSByZWxhdGl2ZSB0byBub3csIHN1Y2ggYXMgXCJpbiB0d28gZGF5c1wiLiBDYW4gb25seSBpbnRlcm5hdGlvbmFsaXplIGlmIHlvdXJcbiAgICogcGxhdGZvcm0gc3VwcG9ydHMgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQuIFJvdW5kcyBkb3duIGJ5IGRlZmF1bHQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgb3V0cHV0XG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IFtvcHRpb25zLmJhc2U9RGF0ZVRpbWUubm93KCldIC0gdGhlIERhdGVUaW1lIHRvIHVzZSBhcyB0aGUgYmFzaXMgdG8gd2hpY2ggdGhpcyB0aW1lIGlzIGNvbXBhcmVkLiBEZWZhdWx0cyB0byBub3cuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zdHlsZT1cImxvbmdcIl0gLSB0aGUgc3R5bGUgb2YgdW5pdHMsIG11c3QgYmUgXCJsb25nXCIsIFwic2hvcnRcIiwgb3IgXCJuYXJyb3dcIlxuICAgKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gb3B0aW9ucy51bml0IC0gdXNlIGEgc3BlY2lmaWMgdW5pdCBvciBhcnJheSBvZiB1bml0czsgaWYgb21pdHRlZCwgb3IgYW4gYXJyYXksIHRoZSBtZXRob2Qgd2lsbCBwaWNrIHRoZSBiZXN0IHVuaXQuIFVzZSBhbiBhcnJheSBvciBvbmUgb2YgXCJ5ZWFyc1wiLCBcInF1YXJ0ZXJzXCIsIFwibW9udGhzXCIsIFwid2Vla3NcIiwgXCJkYXlzXCIsIFwiaG91cnNcIiwgXCJtaW51dGVzXCIsIG9yIFwic2Vjb25kc1wiXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucm91bmQ9dHJ1ZV0gLSB3aGV0aGVyIHRvIHJvdW5kIHRoZSBudW1iZXJzIGluIHRoZSBvdXRwdXQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5wYWRkaW5nPTBdIC0gcGFkZGluZyBpbiBtaWxsaXNlY29uZHMuIFRoaXMgYWxsb3dzIHlvdSB0byByb3VuZCB1cCB0aGUgcmVzdWx0IGlmIGl0IGZpdHMgaW5zaWRlIHRoZSB0aHJlc2hvbGQuIERvbid0IHVzZSBpbiBjb21iaW5hdGlvbiB3aXRoIHtyb3VuZDogZmFsc2V9IGJlY2F1c2UgdGhlIGRlY2ltYWwgb3V0cHV0IHdpbGwgaW5jbHVkZSB0aGUgcGFkZGluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubG9jYWxlIC0gb3ZlcnJpZGUgdGhlIGxvY2FsZSBvZiB0aGlzIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSAtIG92ZXJyaWRlIHRoZSBudW1iZXJpbmdTeXN0ZW0gb2YgdGhpcyBEYXRlVGltZS4gVGhlIEludGwgc3lzdGVtIG1heSBjaG9vc2Ugbm90IHRvIGhvbm9yIHRoaXNcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IGRheXM6IDEgfSkudG9SZWxhdGl2ZSgpIC8vPT4gXCJpbiAxIGRheVwiXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnNldExvY2FsZShcImVzXCIpLnRvUmVsYXRpdmUoeyBkYXlzOiAxIH0pIC8vPT4gXCJkZW50cm8gZGUgMSBkXHUwMEVEYVwiXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoeyBkYXlzOiAxIH0pLnRvUmVsYXRpdmUoeyBsb2NhbGU6IFwiZnJcIiB9KSAvLz0+IFwiZGFucyAyMyBoZXVyZXNcIlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5taW51cyh7IGRheXM6IDIgfSkudG9SZWxhdGl2ZSgpIC8vPT4gXCIyIGRheXMgYWdvXCJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkubWludXMoeyBkYXlzOiAyIH0pLnRvUmVsYXRpdmUoeyB1bml0OiBcImhvdXJzXCIgfSkgLy89PiBcIjQ4IGhvdXJzIGFnb1wiXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLm1pbnVzKHsgaG91cnM6IDM2IH0pLnRvUmVsYXRpdmUoeyByb3VuZDogZmFsc2UgfSkgLy89PiBcIjEuNSBkYXlzIGFnb1wiXG4gICAqL1xuICB0b1JlbGF0aXZlKG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBiYXNlID0gb3B0aW9ucy5iYXNlIHx8IERhdGVUaW1lLmZyb21PYmplY3Qoe30sIHsgem9uZTogdGhpcy56b25lIH0pLFxuICAgICAgcGFkZGluZyA9IG9wdGlvbnMucGFkZGluZyA/ICh0aGlzIDwgYmFzZSA/IC1vcHRpb25zLnBhZGRpbmcgOiBvcHRpb25zLnBhZGRpbmcpIDogMDtcbiAgICBsZXQgdW5pdHMgPSBbXCJ5ZWFyc1wiLCBcIm1vbnRoc1wiLCBcImRheXNcIiwgXCJob3Vyc1wiLCBcIm1pbnV0ZXNcIiwgXCJzZWNvbmRzXCJdO1xuICAgIGxldCB1bml0ID0gb3B0aW9ucy51bml0O1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMudW5pdCkpIHtcbiAgICAgIHVuaXRzID0gb3B0aW9ucy51bml0O1xuICAgICAgdW5pdCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGRpZmZSZWxhdGl2ZShiYXNlLCB0aGlzLnBsdXMocGFkZGluZyksIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBudW1lcmljOiBcImFsd2F5c1wiLFxuICAgICAgdW5pdHMsXG4gICAgICB1bml0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBkYXRlIHJlbGF0aXZlIHRvIHRvZGF5LCBzdWNoIGFzIFwieWVzdGVyZGF5XCIgb3IgXCJuZXh0IG1vbnRoXCIuXG4gICAqIE9ubHkgaW50ZXJuYXRpb25hbGl6ZXMgb24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydHMgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgb3V0cHV0XG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IFtvcHRpb25zLmJhc2U9RGF0ZVRpbWUubm93KCldIC0gdGhlIERhdGVUaW1lIHRvIHVzZSBhcyB0aGUgYmFzaXMgdG8gd2hpY2ggdGhpcyB0aW1lIGlzIGNvbXBhcmVkLiBEZWZhdWx0cyB0byBub3cuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmxvY2FsZSAtIG92ZXJyaWRlIHRoZSBsb2NhbGUgb2YgdGhpcyBEYXRlVGltZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy51bml0IC0gdXNlIGEgc3BlY2lmaWMgdW5pdDsgaWYgb21pdHRlZCwgdGhlIG1ldGhvZCB3aWxsIHBpY2sgdGhlIHVuaXQuIFVzZSBvbmUgb2YgXCJ5ZWFyc1wiLCBcInF1YXJ0ZXJzXCIsIFwibW9udGhzXCIsIFwid2Vla3NcIiwgb3IgXCJkYXlzXCJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubnVtYmVyaW5nU3lzdGVtIC0gb3ZlcnJpZGUgdGhlIG51bWJlcmluZ1N5c3RlbSBvZiB0aGlzIERhdGVUaW1lLiBUaGUgSW50bCBzeXN0ZW0gbWF5IGNob29zZSBub3QgdG8gaG9ub3IgdGhpc1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5wbHVzKHsgZGF5czogMSB9KS50b1JlbGF0aXZlQ2FsZW5kYXIoKSAvLz0+IFwidG9tb3Jyb3dcIlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5zZXRMb2NhbGUoXCJlc1wiKS5wbHVzKHsgZGF5czogMSB9KS50b1JlbGF0aXZlKCkgLy89PiBcIlwibWFcdTAwRjFhbmFcIlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5wbHVzKHsgZGF5czogMSB9KS50b1JlbGF0aXZlQ2FsZW5kYXIoeyBsb2NhbGU6IFwiZnJcIiB9KSAvLz0+IFwiZGVtYWluXCJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkubWludXMoeyBkYXlzOiAyIH0pLnRvUmVsYXRpdmVDYWxlbmRhcigpIC8vPT4gXCIyIGRheXMgYWdvXCJcbiAgICovXG4gIHRvUmVsYXRpdmVDYWxlbmRhcihvcHRpb25zID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gZGlmZlJlbGF0aXZlKG9wdGlvbnMuYmFzZSB8fCBEYXRlVGltZS5mcm9tT2JqZWN0KHt9LCB7IHpvbmU6IHRoaXMuem9uZSB9KSwgdGhpcywge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG51bWVyaWM6IFwiYXV0b1wiLFxuICAgICAgdW5pdHM6IFtcInllYXJzXCIsIFwibW9udGhzXCIsIFwiZGF5c1wiXSxcbiAgICAgIGNhbGVuZGFyeTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG1pbiBvZiBzZXZlcmFsIGRhdGUgdGltZXNcbiAgICogQHBhcmFtIHsuLi5EYXRlVGltZX0gZGF0ZVRpbWVzIC0gdGhlIERhdGVUaW1lcyBmcm9tIHdoaWNoIHRvIGNob29zZSB0aGUgbWluaW11bVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX0gdGhlIG1pbiBEYXRlVGltZSwgb3IgdW5kZWZpbmVkIGlmIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50XG4gICAqL1xuICBzdGF0aWMgbWluKC4uLmRhdGVUaW1lcykge1xuICAgIGlmICghZGF0ZVRpbWVzLmV2ZXJ5KERhdGVUaW1lLmlzRGF0ZVRpbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJtaW4gcmVxdWlyZXMgYWxsIGFyZ3VtZW50cyBiZSBEYXRlVGltZXNcIik7XG4gICAgfVxuICAgIHJldHVybiBiZXN0QnkoZGF0ZVRpbWVzLCAoaSkgPT4gaS52YWx1ZU9mKCksIE1hdGgubWluKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG1heCBvZiBzZXZlcmFsIGRhdGUgdGltZXNcbiAgICogQHBhcmFtIHsuLi5EYXRlVGltZX0gZGF0ZVRpbWVzIC0gdGhlIERhdGVUaW1lcyBmcm9tIHdoaWNoIHRvIGNob29zZSB0aGUgbWF4aW11bVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX0gdGhlIG1heCBEYXRlVGltZSwgb3IgdW5kZWZpbmVkIGlmIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50XG4gICAqL1xuICBzdGF0aWMgbWF4KC4uLmRhdGVUaW1lcykge1xuICAgIGlmICghZGF0ZVRpbWVzLmV2ZXJ5KERhdGVUaW1lLmlzRGF0ZVRpbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJtYXggcmVxdWlyZXMgYWxsIGFyZ3VtZW50cyBiZSBEYXRlVGltZXNcIik7XG4gICAgfVxuICAgIHJldHVybiBiZXN0QnkoZGF0ZVRpbWVzLCAoaSkgPT4gaS52YWx1ZU9mKCksIE1hdGgubWF4KTtcbiAgfVxuXG4gIC8vIE1JU0NcblxuICAvKipcbiAgICogRXhwbGFpbiBob3cgYSBzdHJpbmcgd291bGQgYmUgcGFyc2VkIGJ5IGZyb21Gb3JtYXQoKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBzdHJpbmcgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZtdCAtIHRoZSBmb3JtYXQgdGhlIHN0cmluZyBpcyBleHBlY3RlZCB0byBiZSBpbiAoc2VlIGRlc2NyaXB0aW9uKVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgdGFrZW4gYnkgZnJvbUZvcm1hdCgpXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBmcm9tRm9ybWF0RXhwbGFpbih0ZXh0LCBmbXQsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsgbG9jYWxlID0gbnVsbCwgbnVtYmVyaW5nU3lzdGVtID0gbnVsbCB9ID0gb3B0aW9ucyxcbiAgICAgIGxvY2FsZVRvVXNlID0gTG9jYWxlLmZyb21PcHRzKHtcbiAgICAgICAgbG9jYWxlLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIGRlZmF1bHRUb0VOOiB0cnVlLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIGV4cGxhaW5Gcm9tVG9rZW5zKGxvY2FsZVRvVXNlLCB0ZXh0LCBmbXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBmcm9tRm9ybWF0RXhwbGFpbiBpbnN0ZWFkXG4gICAqL1xuICBzdGF0aWMgZnJvbVN0cmluZ0V4cGxhaW4odGV4dCwgZm10LCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUZvcm1hdEV4cGxhaW4odGV4dCwgZm10LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vIEZPUk1BVCBQUkVTRVRTXG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZS50b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgMTAvMTQvMTk4M1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBEQVRFX1NIT1JUKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVfU0hPUlQ7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lLnRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0IDE0LCAxOTgzJ1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBEQVRFX01FRCgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFX01FRDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUudG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdGcmksIE9jdCAxNCwgMTk4MydcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURV9NRURfV0lUSF9XRUVLREFZKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVfTUVEX1dJVEhfV0VFS0RBWTtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUudG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3RvYmVyIDE0LCAxOTgzJ1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBEQVRFX0ZVTEwoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURV9GVUxMO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZS50b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ1R1ZXNkYXksIE9jdG9iZXIgMTQsIDE5ODMnXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERBVEVfSFVHRSgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFX0hVR0U7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lLnRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgVElNRV9TSU1QTEUoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuVElNRV9TSU1QTEU7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lLnRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgVElNRV9XSVRIX1NFQ09ORFMoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuVElNRV9XSVRIX1NFQ09ORFM7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lLnRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgQU0gRURUJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IFRJTUVfV0lUSF9TSE9SVF9PRkZTRVQoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuVElNRV9XSVRIX1NIT1JUX09GRlNFVDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUudG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBBTSBFYXN0ZXJuIERheWxpZ2h0IFRpbWUnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgVElNRV9XSVRIX0xPTkdfT0ZGU0VUKCkge1xuICAgIHJldHVybiBGb3JtYXRzLlRJTUVfV0lUSF9MT05HX09GRlNFVDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUudG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMCcsIGFsd2F5cyAyNC1ob3VyLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBUSU1FXzI0X1NJTVBMRSgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5USU1FXzI0X1NJTVBMRTtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUudG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMycsIGFsd2F5cyAyNC1ob3VyLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBUSU1FXzI0X1dJVEhfU0VDT05EUygpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5USU1FXzI0X1dJVEhfU0VDT05EUztcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUudG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBFRFQnLCBhbHdheXMgMjQtaG91ci5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5USU1FXzI0X1dJVEhfU0hPUlRfT0ZGU0VUO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZS50b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEVhc3Rlcm4gRGF5bGlnaHQgVGltZScsIGFsd2F5cyAyNC1ob3VyLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VUO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZS50b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzEwLzE0LzE5ODMsIDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfU0hPUlQoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURVRJTUVfU0hPUlQ7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lLnRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMTAvMTQvMTk4MywgOTozMDozMyBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZS50b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdCAxNCwgMTk4MywgOTozMCBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBEQVRFVElNRV9NRUQoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURVRJTUVfTUVEO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZS50b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdCAxNCwgMTk4MywgOTozMDozMyBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBEQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFM7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lLnRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnRnJpLCAxNCBPY3QgMTk4MywgOTozMCBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBEQVRFVElNRV9NRURfV0lUSF9XRUVLREFZKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVUSU1FX01FRF9XSVRIX1dFRUtEQVk7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lLnRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0b2JlciAxNCwgMTk4MywgOTozMCBBTSBFRFQnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfRlVMTCgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFVElNRV9GVUxMO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZS50b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdG9iZXIgMTQsIDE5ODMsIDk6MzA6MzMgQU0gRURUJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZS50b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ0ZyaWRheSwgT2N0b2JlciAxNCwgMTk4MywgOTozMCBBTSBFYXN0ZXJuIERheWxpZ2h0IFRpbWUnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfSFVHRSgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFVElNRV9IVUdFO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZS50b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ0ZyaWRheSwgT2N0b2JlciAxNCwgMTk4MywgOTozMDozMyBBTSBFYXN0ZXJuIERheWxpZ2h0IFRpbWUnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFMoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFM7XG4gIH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJpZW5kbHlEYXRlVGltZShkYXRlVGltZWlzaCkge1xuICBpZiAoRGF0ZVRpbWUuaXNEYXRlVGltZShkYXRlVGltZWlzaCkpIHtcbiAgICByZXR1cm4gZGF0ZVRpbWVpc2g7XG4gIH0gZWxzZSBpZiAoZGF0ZVRpbWVpc2ggJiYgZGF0ZVRpbWVpc2gudmFsdWVPZiAmJiBpc051bWJlcihkYXRlVGltZWlzaC52YWx1ZU9mKCkpKSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmZyb21KU0RhdGUoZGF0ZVRpbWVpc2gpO1xuICB9IGVsc2UgaWYgKGRhdGVUaW1laXNoICYmIHR5cGVvZiBkYXRlVGltZWlzaCA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBEYXRlVGltZS5mcm9tT2JqZWN0KGRhdGVUaW1laXNoKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICBgVW5rbm93biBkYXRldGltZSBhcmd1bWVudDogJHtkYXRlVGltZWlzaH0sIG9mIHR5cGUgJHt0eXBlb2YgZGF0ZVRpbWVpc2h9YFxuICAgICk7XG4gIH1cbn1cbiIsICJpbXBvcnQgRGF0ZVRpbWUgZnJvbSBcIi4vZGF0ZXRpbWUuanNcIjtcbmltcG9ydCBEdXJhdGlvbiBmcm9tIFwiLi9kdXJhdGlvbi5qc1wiO1xuaW1wb3J0IEludGVydmFsIGZyb20gXCIuL2ludGVydmFsLmpzXCI7XG5pbXBvcnQgSW5mbyBmcm9tIFwiLi9pbmZvLmpzXCI7XG5pbXBvcnQgWm9uZSBmcm9tIFwiLi96b25lLmpzXCI7XG5pbXBvcnQgRml4ZWRPZmZzZXRab25lIGZyb20gXCIuL3pvbmVzL2ZpeGVkT2Zmc2V0Wm9uZS5qc1wiO1xuaW1wb3J0IElBTkFab25lIGZyb20gXCIuL3pvbmVzL0lBTkFab25lLmpzXCI7XG5pbXBvcnQgSW52YWxpZFpvbmUgZnJvbSBcIi4vem9uZXMvaW52YWxpZFpvbmUuanNcIjtcbmltcG9ydCBTeXN0ZW1ab25lIGZyb20gXCIuL3pvbmVzL3N5c3RlbVpvbmUuanNcIjtcbmltcG9ydCBTZXR0aW5ncyBmcm9tIFwiLi9zZXR0aW5ncy5qc1wiO1xuXG5jb25zdCBWRVJTSU9OID0gXCIyLjAuMlwiO1xuXG5leHBvcnQge1xuICBWRVJTSU9OLFxuICBEYXRlVGltZSxcbiAgRHVyYXRpb24sXG4gIEludGVydmFsLFxuICBJbmZvLFxuICBab25lLFxuICBGaXhlZE9mZnNldFpvbmUsXG4gIElBTkFab25lLFxuICBJbnZhbGlkWm9uZSxcbiAgU3lzdGVtWm9uZSxcbiAgU2V0dGluZ3MsXG59O1xuIiwgIi8qXG5UdXJibyA3LjAuMC1yYy4yXG5Db3B5cmlnaHQgXHUwMEE5IDIwMjEgQmFzZWNhbXAsIExMQ1xuICovXG4oZnVuY3Rpb24gKCkge1xuICAgIGlmICh3aW5kb3cuUmVmbGVjdCA9PT0gdW5kZWZpbmVkIHx8IHdpbmRvdy5jdXN0b21FbGVtZW50cyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIHdpbmRvdy5jdXN0b21FbGVtZW50cy5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgQnVpbHRJbkhUTUxFbGVtZW50ID0gSFRNTEVsZW1lbnQ7XG4gICAgY29uc3Qgd3JhcHBlckZvclRoZU5hbWUgPSB7XG4gICAgICAgICdIVE1MRWxlbWVudCc6IGZ1bmN0aW9uIEhUTUxFbGVtZW50KCkge1xuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuY29uc3RydWN0KEJ1aWx0SW5IVE1MRWxlbWVudCwgW10sIHRoaXMuY29uc3RydWN0b3IpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICB3aW5kb3cuSFRNTEVsZW1lbnQgPVxuICAgICAgICB3cmFwcGVyRm9yVGhlTmFtZVsnSFRNTEVsZW1lbnQnXTtcbiAgICBIVE1MRWxlbWVudC5wcm90b3R5cGUgPSBCdWlsdEluSFRNTEVsZW1lbnQucHJvdG90eXBlO1xuICAgIEhUTUxFbGVtZW50LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEhUTUxFbGVtZW50O1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihIVE1MRWxlbWVudCwgQnVpbHRJbkhUTUxFbGVtZW50KTtcbn0pKCk7XG5cbmNvbnN0IHN1Ym1pdHRlcnNCeUZvcm0gPSBuZXcgV2Vha01hcDtcbmZ1bmN0aW9uIGZpbmRTdWJtaXR0ZXJGcm9tQ2xpY2tUYXJnZXQodGFyZ2V0KSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgPyB0YXJnZXQgOiB0YXJnZXQgaW5zdGFuY2VvZiBOb2RlID8gdGFyZ2V0LnBhcmVudEVsZW1lbnQgOiBudWxsO1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGVsZW1lbnQgPyBlbGVtZW50LmNsb3Nlc3QoXCJpbnB1dCwgYnV0dG9uXCIpIDogbnVsbDtcbiAgICByZXR1cm4gKGNhbmRpZGF0ZSA9PT0gbnVsbCB8fCBjYW5kaWRhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNhbmRpZGF0ZS50eXBlKSA9PSBcInN1Ym1pdFwiID8gY2FuZGlkYXRlIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGNsaWNrQ2FwdHVyZWQoZXZlbnQpIHtcbiAgICBjb25zdCBzdWJtaXR0ZXIgPSBmaW5kU3VibWl0dGVyRnJvbUNsaWNrVGFyZ2V0KGV2ZW50LnRhcmdldCk7XG4gICAgaWYgKHN1Ym1pdHRlciAmJiBzdWJtaXR0ZXIuZm9ybSkge1xuICAgICAgICBzdWJtaXR0ZXJzQnlGb3JtLnNldChzdWJtaXR0ZXIuZm9ybSwgc3VibWl0dGVyKTtcbiAgICB9XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIGlmIChcIlN1Ym1pdEV2ZW50XCIgaW4gd2luZG93KVxuICAgICAgICByZXR1cm47XG4gICAgYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGNsaWNrQ2FwdHVyZWQsIHRydWUpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudC5wcm90b3R5cGUsIFwic3VibWl0dGVyXCIsIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBcInN1Ym1pdFwiICYmIHRoaXMudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN1Ym1pdHRlcnNCeUZvcm0uZ2V0KHRoaXMudGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufSkoKTtcblxudmFyIEZyYW1lTG9hZGluZ1N0eWxlO1xuKGZ1bmN0aW9uIChGcmFtZUxvYWRpbmdTdHlsZSkge1xuICAgIEZyYW1lTG9hZGluZ1N0eWxlW1wiZWFnZXJcIl0gPSBcImVhZ2VyXCI7XG4gICAgRnJhbWVMb2FkaW5nU3R5bGVbXCJsYXp5XCJdID0gXCJsYXp5XCI7XG59KShGcmFtZUxvYWRpbmdTdHlsZSB8fCAoRnJhbWVMb2FkaW5nU3R5bGUgPSB7fSkpO1xuY2xhc3MgRnJhbWVFbGVtZW50IGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmxvYWRlZCA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB0aGlzLmRlbGVnYXRlID0gbmV3IEZyYW1lRWxlbWVudC5kZWxlZ2F0ZUNvbnN0cnVjdG9yKHRoaXMpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICAgICAgcmV0dXJuIFtcImRpc2FibGVkXCIsIFwibG9hZGluZ1wiLCBcInNyY1wiXTtcbiAgICB9XG4gICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgIHRoaXMuZGVsZWdhdGUuY29ubmVjdCgpO1xuICAgIH1cbiAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZS5kaXNjb25uZWN0KCk7XG4gICAgfVxuICAgIHJlbG9hZCgpIHtcbiAgICAgICAgY29uc3QgeyBzcmMgfSA9IHRoaXM7XG4gICAgICAgIHRoaXMuc3JjID0gbnVsbDtcbiAgICAgICAgdGhpcy5zcmMgPSBzcmM7XG4gICAgfVxuICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lKSB7XG4gICAgICAgIGlmIChuYW1lID09IFwibG9hZGluZ1wiKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGVnYXRlLmxvYWRpbmdTdHlsZUNoYW5nZWQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lID09IFwic3JjXCIpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUuc291cmNlVVJMQ2hhbmdlZCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5kaXNhYmxlZENoYW5nZWQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgc3JjKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoXCJzcmNcIik7XG4gICAgfVxuICAgIHNldCBzcmModmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShcInNyY1wiLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShcInNyY1wiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgbG9hZGluZygpIHtcbiAgICAgICAgcmV0dXJuIGZyYW1lTG9hZGluZ1N0eWxlRnJvbVN0cmluZyh0aGlzLmdldEF0dHJpYnV0ZShcImxvYWRpbmdcIikgfHwgXCJcIik7XG4gICAgfVxuICAgIHNldCBsb2FkaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoXCJsb2FkaW5nXCIsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKFwibG9hZGluZ1wiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgZGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpO1xuICAgIH1cbiAgICBzZXQgZGlzYWJsZWQodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShcImRpc2FibGVkXCIsIFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgYXV0b3Njcm9sbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzQXR0cmlidXRlKFwiYXV0b3Njcm9sbFwiKTtcbiAgICB9XG4gICAgc2V0IGF1dG9zY3JvbGwodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShcImF1dG9zY3JvbGxcIiwgXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShcImF1dG9zY3JvbGxcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGNvbXBsZXRlKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuZGVsZWdhdGUuaXNMb2FkaW5nO1xuICAgIH1cbiAgICBnZXQgaXNBY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQgPT09IGRvY3VtZW50ICYmICF0aGlzLmlzUHJldmlldztcbiAgICB9XG4gICAgZ2V0IGlzUHJldmlldygpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IHRoaXMub3duZXJEb2N1bWVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRvY3VtZW50RWxlbWVudCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmhhc0F0dHJpYnV0ZShcImRhdGEtdHVyYm8tcHJldmlld1wiKTtcbiAgICB9XG59XG5mdW5jdGlvbiBmcmFtZUxvYWRpbmdTdHlsZUZyb21TdHJpbmcoc3R5bGUpIHtcbiAgICBzd2l0Y2ggKHN0eWxlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgY2FzZSBcImxhenlcIjogcmV0dXJuIEZyYW1lTG9hZGluZ1N0eWxlLmxhenk7XG4gICAgICAgIGRlZmF1bHQ6IHJldHVybiBGcmFtZUxvYWRpbmdTdHlsZS5lYWdlcjtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGV4cGFuZFVSTChsb2NhdGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFVSTChsb2NhdGFibGUudG9TdHJpbmcoKSwgZG9jdW1lbnQuYmFzZVVSSSk7XG59XG5mdW5jdGlvbiBnZXRBbmNob3IodXJsKSB7XG4gICAgbGV0IGFuY2hvck1hdGNoO1xuICAgIGlmICh1cmwuaGFzaCkge1xuICAgICAgICByZXR1cm4gdXJsLmhhc2guc2xpY2UoMSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFuY2hvck1hdGNoID0gdXJsLmhyZWYubWF0Y2goLyMoLiopJC8pKSB7XG4gICAgICAgIHJldHVybiBhbmNob3JNYXRjaFsxXTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRFeHRlbnNpb24odXJsKSB7XG4gICAgcmV0dXJuIChnZXRMYXN0UGF0aENvbXBvbmVudCh1cmwpLm1hdGNoKC9cXC5bXi5dKiQvKSB8fCBbXSlbMF0gfHwgXCJcIjtcbn1cbmZ1bmN0aW9uIGlzSFRNTCh1cmwpIHtcbiAgICByZXR1cm4gISFnZXRFeHRlbnNpb24odXJsKS5tYXRjaCgvXig/OnxcXC4oPzpodG18aHRtbHx4aHRtbCkpJC8pO1xufVxuZnVuY3Rpb24gaXNQcmVmaXhlZEJ5KGJhc2VVUkwsIHVybCkge1xuICAgIGNvbnN0IHByZWZpeCA9IGdldFByZWZpeCh1cmwpO1xuICAgIHJldHVybiBiYXNlVVJMLmhyZWYgPT09IGV4cGFuZFVSTChwcmVmaXgpLmhyZWYgfHwgYmFzZVVSTC5ocmVmLnN0YXJ0c1dpdGgocHJlZml4KTtcbn1cbmZ1bmN0aW9uIGdldFJlcXVlc3RVUkwodXJsKSB7XG4gICAgY29uc3QgYW5jaG9yID0gZ2V0QW5jaG9yKHVybCk7XG4gICAgcmV0dXJuIGFuY2hvciAhPSBudWxsXG4gICAgICAgID8gdXJsLmhyZWYuc2xpY2UoMCwgLShhbmNob3IubGVuZ3RoICsgMSkpXG4gICAgICAgIDogdXJsLmhyZWY7XG59XG5mdW5jdGlvbiB0b0NhY2hlS2V5KHVybCkge1xuICAgIHJldHVybiBnZXRSZXF1ZXN0VVJMKHVybCk7XG59XG5mdW5jdGlvbiB1cmxzQXJlRXF1YWwobGVmdCwgcmlnaHQpIHtcbiAgICByZXR1cm4gZXhwYW5kVVJMKGxlZnQpLmhyZWYgPT0gZXhwYW5kVVJMKHJpZ2h0KS5ocmVmO1xufVxuZnVuY3Rpb24gZ2V0UGF0aENvbXBvbmVudHModXJsKSB7XG4gICAgcmV0dXJuIHVybC5wYXRobmFtZS5zcGxpdChcIi9cIikuc2xpY2UoMSk7XG59XG5mdW5jdGlvbiBnZXRMYXN0UGF0aENvbXBvbmVudCh1cmwpIHtcbiAgICByZXR1cm4gZ2V0UGF0aENvbXBvbmVudHModXJsKS5zbGljZSgtMSlbMF07XG59XG5mdW5jdGlvbiBnZXRQcmVmaXgodXJsKSB7XG4gICAgcmV0dXJuIGFkZFRyYWlsaW5nU2xhc2godXJsLm9yaWdpbiArIHVybC5wYXRobmFtZSk7XG59XG5mdW5jdGlvbiBhZGRUcmFpbGluZ1NsYXNoKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLmVuZHNXaXRoKFwiL1wiKSA/IHZhbHVlIDogdmFsdWUgKyBcIi9cIjtcbn1cblxuY2xhc3MgRmV0Y2hSZXNwb25zZSB7XG4gICAgY29uc3RydWN0b3IocmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgIH1cbiAgICBnZXQgc3VjY2VlZGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNwb25zZS5vaztcbiAgICB9XG4gICAgZ2V0IGZhaWxlZCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnN1Y2NlZWRlZDtcbiAgICB9XG4gICAgZ2V0IGNsaWVudEVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0dXNDb2RlID49IDQwMCAmJiB0aGlzLnN0YXR1c0NvZGUgPD0gNDk5O1xuICAgIH1cbiAgICBnZXQgc2VydmVyRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXR1c0NvZGUgPj0gNTAwICYmIHRoaXMuc3RhdHVzQ29kZSA8PSA1OTk7XG4gICAgfVxuICAgIGdldCByZWRpcmVjdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNwb25zZS5yZWRpcmVjdGVkO1xuICAgIH1cbiAgICBnZXQgbG9jYXRpb24oKSB7XG4gICAgICAgIHJldHVybiBleHBhbmRVUkwodGhpcy5yZXNwb25zZS51cmwpO1xuICAgIH1cbiAgICBnZXQgaXNIVE1MKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50VHlwZSAmJiB0aGlzLmNvbnRlbnRUeXBlLm1hdGNoKC9eKD86dGV4dFxcLyhbXlxcczssXStcXGIpP2h0bWx8YXBwbGljYXRpb25cXC94aHRtbFxcK3htbClcXGIvKTtcbiAgICB9XG4gICAgZ2V0IHN0YXR1c0NvZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc3BvbnNlLnN0YXR1cztcbiAgICB9XG4gICAgZ2V0IGNvbnRlbnRUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWFkZXIoXCJDb250ZW50LVR5cGVcIik7XG4gICAgfVxuICAgIGdldCByZXNwb25zZVRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc3BvbnNlLnRleHQoKTtcbiAgICB9XG4gICAgZ2V0IHJlc3BvbnNlSFRNTCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNIVE1MKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGVhZGVyKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzcG9uc2UuaGVhZGVycy5nZXQobmFtZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaChldmVudE5hbWUsIHsgdGFyZ2V0LCBjYW5jZWxhYmxlLCBkZXRhaWwgfSA9IHt9KSB7XG4gICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGNhbmNlbGFibGUsIGJ1YmJsZXM6IHRydWUsIGRldGFpbCB9KTtcbiAgICB2b2lkICh0YXJnZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICByZXR1cm4gZXZlbnQ7XG59XG5mdW5jdGlvbiBuZXh0QW5pbWF0aW9uRnJhbWUoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHJlc29sdmUoKSkpO1xufVxuZnVuY3Rpb24gbmV4dEV2ZW50TG9vcFRpY2soKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIDApKTtcbn1cbmZ1bmN0aW9uIG5leHRNaWNyb3Rhc2soKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufVxuZnVuY3Rpb24gcGFyc2VIVE1MRG9jdW1lbnQoaHRtbCA9IFwiXCIpIHtcbiAgICByZXR1cm4gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhodG1sLCBcInRleHQvaHRtbFwiKTtcbn1cbmZ1bmN0aW9uIHVuaW5kZW50KHN0cmluZ3MsIC4uLnZhbHVlcykge1xuICAgIGNvbnN0IGxpbmVzID0gaW50ZXJwb2xhdGUoc3RyaW5ncywgdmFsdWVzKS5yZXBsYWNlKC9eXFxuLywgXCJcIikuc3BsaXQoXCJcXG5cIik7XG4gICAgY29uc3QgbWF0Y2ggPSBsaW5lc1swXS5tYXRjaCgvXlxccysvKTtcbiAgICBjb25zdCBpbmRlbnQgPSBtYXRjaCA/IG1hdGNoWzBdLmxlbmd0aCA6IDA7XG4gICAgcmV0dXJuIGxpbmVzLm1hcChsaW5lID0+IGxpbmUuc2xpY2UoaW5kZW50KSkuam9pbihcIlxcblwiKTtcbn1cbmZ1bmN0aW9uIGludGVycG9sYXRlKHN0cmluZ3MsIHZhbHVlcykge1xuICAgIHJldHVybiBzdHJpbmdzLnJlZHVjZSgocmVzdWx0LCBzdHJpbmcsIGkpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbaV0gPT0gdW5kZWZpbmVkID8gXCJcIiA6IHZhbHVlc1tpXTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCArIHN0cmluZyArIHZhbHVlO1xuICAgIH0sIFwiXCIpO1xufVxuZnVuY3Rpb24gdXVpZCgpIHtcbiAgICByZXR1cm4gQXJyYXkuYXBwbHkobnVsbCwgeyBsZW5ndGg6IDM2IH0pLm1hcCgoXywgaSkgPT4ge1xuICAgICAgICBpZiAoaSA9PSA4IHx8IGkgPT0gMTMgfHwgaSA9PSAxOCB8fCBpID09IDIzKSB7XG4gICAgICAgICAgICByZXR1cm4gXCItXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaSA9PSAxNCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiNFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGkgPT0gMTkpIHtcbiAgICAgICAgICAgIHJldHVybiAoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNCkgKyA4KS50b1N0cmluZygxNik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTUpLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgfVxuICAgIH0pLmpvaW4oXCJcIik7XG59XG5cbnZhciBGZXRjaE1ldGhvZDtcbihmdW5jdGlvbiAoRmV0Y2hNZXRob2QpIHtcbiAgICBGZXRjaE1ldGhvZFtGZXRjaE1ldGhvZFtcImdldFwiXSA9IDBdID0gXCJnZXRcIjtcbiAgICBGZXRjaE1ldGhvZFtGZXRjaE1ldGhvZFtcInBvc3RcIl0gPSAxXSA9IFwicG9zdFwiO1xuICAgIEZldGNoTWV0aG9kW0ZldGNoTWV0aG9kW1wicHV0XCJdID0gMl0gPSBcInB1dFwiO1xuICAgIEZldGNoTWV0aG9kW0ZldGNoTWV0aG9kW1wicGF0Y2hcIl0gPSAzXSA9IFwicGF0Y2hcIjtcbiAgICBGZXRjaE1ldGhvZFtGZXRjaE1ldGhvZFtcImRlbGV0ZVwiXSA9IDRdID0gXCJkZWxldGVcIjtcbn0pKEZldGNoTWV0aG9kIHx8IChGZXRjaE1ldGhvZCA9IHt9KSk7XG5mdW5jdGlvbiBmZXRjaE1ldGhvZEZyb21TdHJpbmcobWV0aG9kKSB7XG4gICAgc3dpdGNoIChtZXRob2QudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBjYXNlIFwiZ2V0XCI6IHJldHVybiBGZXRjaE1ldGhvZC5nZXQ7XG4gICAgICAgIGNhc2UgXCJwb3N0XCI6IHJldHVybiBGZXRjaE1ldGhvZC5wb3N0O1xuICAgICAgICBjYXNlIFwicHV0XCI6IHJldHVybiBGZXRjaE1ldGhvZC5wdXQ7XG4gICAgICAgIGNhc2UgXCJwYXRjaFwiOiByZXR1cm4gRmV0Y2hNZXRob2QucGF0Y2g7XG4gICAgICAgIGNhc2UgXCJkZWxldGVcIjogcmV0dXJuIEZldGNoTWV0aG9kLmRlbGV0ZTtcbiAgICB9XG59XG5jbGFzcyBGZXRjaFJlcXVlc3Qge1xuICAgIGNvbnN0cnVjdG9yKGRlbGVnYXRlLCBtZXRob2QsIGxvY2F0aW9uLCBib2R5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcykge1xuICAgICAgICB0aGlzLmFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXI7XG4gICAgICAgIHRoaXMucmVzb2x2ZVJlcXVlc3RQcm9taXNlID0gKHZhbHVlKSA9PiB7IH07XG4gICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmICh0aGlzLmlzSWRlbXBvdGVudCkge1xuICAgICAgICAgICAgdGhpcy51cmwgPSBtZXJnZUZvcm1EYXRhRW50cmllcyhsb2NhdGlvbiwgWy4uLmJvZHkuZW50cmllcygpXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuICAgICAgICAgICAgdGhpcy51cmwgPSBsb2NhdGlvbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgbG9jYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVybDtcbiAgICB9XG4gICAgZ2V0IHBhcmFtcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXJsLnNlYXJjaFBhcmFtcztcbiAgICB9XG4gICAgZ2V0IGVudHJpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJvZHkgPyBBcnJheS5mcm9tKHRoaXMuYm9keS5lbnRyaWVzKCkpIDogW107XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5hYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICB9XG4gICAgYXN5bmMgcGVyZm9ybSgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgeyBmZXRjaE9wdGlvbnMgfSA9IHRoaXM7XG4gICAgICAgIChfYiA9IChfYSA9IHRoaXMuZGVsZWdhdGUpLnByZXBhcmVIZWFkZXJzRm9yUmVxdWVzdCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EsIHRoaXMuaGVhZGVycywgdGhpcyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWxsb3dSZXF1ZXN0VG9CZUludGVyY2VwdGVkKGZldGNoT3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmRlbGVnYXRlLnJlcXVlc3RTdGFydGVkKHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh0aGlzLnVybC5ocmVmLCBmZXRjaE9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVjZWl2ZShyZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IubmFtZSAhPT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5yZXF1ZXN0RXJyb3JlZCh0aGlzLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLmRlbGVnYXRlLnJlcXVlc3RGaW5pc2hlZCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyByZWNlaXZlKHJlc3BvbnNlKSB7XG4gICAgICAgIGNvbnN0IGZldGNoUmVzcG9uc2UgPSBuZXcgRmV0Y2hSZXNwb25zZShyZXNwb25zZSk7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gZGlzcGF0Y2goXCJ0dXJibzpiZWZvcmUtZmV0Y2gtcmVzcG9uc2VcIiwgeyBjYW5jZWxhYmxlOiB0cnVlLCBkZXRhaWw6IHsgZmV0Y2hSZXNwb25zZSB9IH0pO1xuICAgICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5yZXF1ZXN0UHJldmVudGVkSGFuZGxpbmdSZXNwb25zZSh0aGlzLCBmZXRjaFJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChmZXRjaFJlc3BvbnNlLnN1Y2NlZWRlZCkge1xuICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5yZXF1ZXN0U3VjY2VlZGVkV2l0aFJlc3BvbnNlKHRoaXMsIGZldGNoUmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5yZXF1ZXN0RmFpbGVkV2l0aFJlc3BvbnNlKHRoaXMsIGZldGNoUmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmZXRjaFJlc3BvbnNlO1xuICAgIH1cbiAgICBnZXQgZmV0Y2hPcHRpb25zKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtZXRob2Q6IEZldGNoTWV0aG9kW3RoaXMubWV0aG9kXS50b1VwcGVyQ2FzZSgpLFxuICAgICAgICAgICAgY3JlZGVudGlhbHM6IFwic2FtZS1vcmlnaW5cIixcbiAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgIHJlZGlyZWN0OiBcImZvbGxvd1wiLFxuICAgICAgICAgICAgYm9keTogdGhpcy5ib2R5LFxuICAgICAgICAgICAgc2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgcmVmZXJyZXI6IChfYSA9IHRoaXMuZGVsZWdhdGUucmVmZXJyZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ocmVmXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldCBkZWZhdWx0SGVhZGVycygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9odG1sLCBhcHBsaWNhdGlvbi94aHRtbCt4bWxcIlxuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXQgaXNJZGVtcG90ZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRob2QgPT0gRmV0Y2hNZXRob2QuZ2V0O1xuICAgIH1cbiAgICBnZXQgYWJvcnRTaWduYWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFib3J0Q29udHJvbGxlci5zaWduYWw7XG4gICAgfVxuICAgIGFzeW5jIGFsbG93UmVxdWVzdFRvQmVJbnRlcmNlcHRlZChmZXRjaE9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdEludGVyY2VwdGlvbiA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gdGhpcy5yZXNvbHZlUmVxdWVzdFByb21pc2UgPSByZXNvbHZlKTtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBkaXNwYXRjaChcInR1cmJvOmJlZm9yZS1mZXRjaC1yZXF1ZXN0XCIsIHsgY2FuY2VsYWJsZTogdHJ1ZSwgZGV0YWlsOiB7IGZldGNoT3B0aW9ucywgdXJsOiB0aGlzLnVybC5ocmVmLCByZXN1bWU6IHRoaXMucmVzb2x2ZVJlcXVlc3RQcm9taXNlIH0gfSk7XG4gICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgICAgICAgICAgYXdhaXQgcmVxdWVzdEludGVyY2VwdGlvbjtcbiAgICB9XG59XG5mdW5jdGlvbiBtZXJnZUZvcm1EYXRhRW50cmllcyh1cmwsIGVudHJpZXMpIHtcbiAgICBjb25zdCBjdXJyZW50U2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh1cmwuc2VhcmNoKTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmIChjdXJyZW50U2VhcmNoUGFyYW1zLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgY3VycmVudFNlYXJjaFBhcmFtcy5kZWxldGUobmFtZSk7XG4gICAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChuYW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChuYW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVybDtcbn1cblxuY2xhc3MgQXBwZWFyYW5jZU9ic2VydmVyIHtcbiAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSwgZWxlbWVudCkge1xuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbnRlcnNlY3QgPSBlbnRyaWVzID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RFbnRyeSA9IGVudHJpZXMuc2xpY2UoLTEpWzBdO1xuICAgICAgICAgICAgaWYgKGxhc3RFbnRyeSA9PT0gbnVsbCB8fCBsYXN0RW50cnkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhc3RFbnRyeS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUuZWxlbWVudEFwcGVhcmVkSW5WaWV3cG9ydCh0aGlzLmVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIodGhpcy5pbnRlcnNlY3QpO1xuICAgIH1cbiAgICBzdGFydCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyLm9ic2VydmUodGhpcy5lbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICBpZiAodGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIudW5vYnNlcnZlKHRoaXMuZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFN0cmVhbU1lc3NhZ2Uge1xuICAgIGNvbnN0cnVjdG9yKGh0bWwpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gICAgICAgIHRoaXMudGVtcGxhdGVFbGVtZW50LmlubmVySFRNTCA9IGh0bWw7XG4gICAgfVxuICAgIHN0YXRpYyB3cmFwKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcyhtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBmcmFnbWVudCgpIHtcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLmZvcmVpZ25FbGVtZW50cykge1xuICAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuaW1wb3J0Tm9kZShlbGVtZW50LCB0cnVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZyYWdtZW50O1xuICAgIH1cbiAgICBnZXQgZm9yZWlnbkVsZW1lbnRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZUNoaWxkcmVuLnJlZHVjZSgoc3RyZWFtRWxlbWVudHMsIGNoaWxkKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2hpbGQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09IFwidHVyYm8tc3RyZWFtXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWy4uLnN0cmVhbUVsZW1lbnRzLCBjaGlsZF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyZWFtRWxlbWVudHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIFtdKTtcbiAgICB9XG4gICAgZ2V0IHRlbXBsYXRlQ2hpbGRyZW4oKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMudGVtcGxhdGVFbGVtZW50LmNvbnRlbnQuY2hpbGRyZW4pO1xuICAgIH1cbn1cblN0cmVhbU1lc3NhZ2UuY29udGVudFR5cGUgPSBcInRleHQvdm5kLnR1cmJvLXN0cmVhbS5odG1sXCI7XG5cbnZhciBGb3JtU3VibWlzc2lvblN0YXRlO1xuKGZ1bmN0aW9uIChGb3JtU3VibWlzc2lvblN0YXRlKSB7XG4gICAgRm9ybVN1Ym1pc3Npb25TdGF0ZVtGb3JtU3VibWlzc2lvblN0YXRlW1wiaW5pdGlhbGl6ZWRcIl0gPSAwXSA9IFwiaW5pdGlhbGl6ZWRcIjtcbiAgICBGb3JtU3VibWlzc2lvblN0YXRlW0Zvcm1TdWJtaXNzaW9uU3RhdGVbXCJyZXF1ZXN0aW5nXCJdID0gMV0gPSBcInJlcXVlc3RpbmdcIjtcbiAgICBGb3JtU3VibWlzc2lvblN0YXRlW0Zvcm1TdWJtaXNzaW9uU3RhdGVbXCJ3YWl0aW5nXCJdID0gMl0gPSBcIndhaXRpbmdcIjtcbiAgICBGb3JtU3VibWlzc2lvblN0YXRlW0Zvcm1TdWJtaXNzaW9uU3RhdGVbXCJyZWNlaXZpbmdcIl0gPSAzXSA9IFwicmVjZWl2aW5nXCI7XG4gICAgRm9ybVN1Ym1pc3Npb25TdGF0ZVtGb3JtU3VibWlzc2lvblN0YXRlW1wic3RvcHBpbmdcIl0gPSA0XSA9IFwic3RvcHBpbmdcIjtcbiAgICBGb3JtU3VibWlzc2lvblN0YXRlW0Zvcm1TdWJtaXNzaW9uU3RhdGVbXCJzdG9wcGVkXCJdID0gNV0gPSBcInN0b3BwZWRcIjtcbn0pKEZvcm1TdWJtaXNzaW9uU3RhdGUgfHwgKEZvcm1TdWJtaXNzaW9uU3RhdGUgPSB7fSkpO1xudmFyIEZvcm1FbmN0eXBlO1xuKGZ1bmN0aW9uIChGb3JtRW5jdHlwZSkge1xuICAgIEZvcm1FbmN0eXBlW1widXJsRW5jb2RlZFwiXSA9IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCI7XG4gICAgRm9ybUVuY3R5cGVbXCJtdWx0aXBhcnRcIl0gPSBcIm11bHRpcGFydC9mb3JtLWRhdGFcIjtcbiAgICBGb3JtRW5jdHlwZVtcInBsYWluXCJdID0gXCJ0ZXh0L3BsYWluXCI7XG59KShGb3JtRW5jdHlwZSB8fCAoRm9ybUVuY3R5cGUgPSB7fSkpO1xuZnVuY3Rpb24gZm9ybUVuY3R5cGVGcm9tU3RyaW5nKGVuY29kaW5nKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGNhc2UgRm9ybUVuY3R5cGUubXVsdGlwYXJ0OiByZXR1cm4gRm9ybUVuY3R5cGUubXVsdGlwYXJ0O1xuICAgICAgICBjYXNlIEZvcm1FbmN0eXBlLnBsYWluOiByZXR1cm4gRm9ybUVuY3R5cGUucGxhaW47XG4gICAgICAgIGRlZmF1bHQ6IHJldHVybiBGb3JtRW5jdHlwZS51cmxFbmNvZGVkO1xuICAgIH1cbn1cbmNsYXNzIEZvcm1TdWJtaXNzaW9uIHtcbiAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSwgZm9ybUVsZW1lbnQsIHN1Ym1pdHRlciwgbXVzdFJlZGlyZWN0ID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IEZvcm1TdWJtaXNzaW9uU3RhdGUuaW5pdGlhbGl6ZWQ7XG4gICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTtcbiAgICAgICAgdGhpcy5mb3JtRWxlbWVudCA9IGZvcm1FbGVtZW50O1xuICAgICAgICB0aGlzLnN1Ym1pdHRlciA9IHN1Ym1pdHRlcjtcbiAgICAgICAgdGhpcy5mb3JtRGF0YSA9IGJ1aWxkRm9ybURhdGEoZm9ybUVsZW1lbnQsIHN1Ym1pdHRlcik7XG4gICAgICAgIHRoaXMuZmV0Y2hSZXF1ZXN0ID0gbmV3IEZldGNoUmVxdWVzdCh0aGlzLCB0aGlzLm1ldGhvZCwgdGhpcy5sb2NhdGlvbiwgdGhpcy5ib2R5KTtcbiAgICAgICAgdGhpcy5tdXN0UmVkaXJlY3QgPSBtdXN0UmVkaXJlY3Q7XG4gICAgfVxuICAgIGdldCBtZXRob2QoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgbWV0aG9kID0gKChfYSA9IHRoaXMuc3VibWl0dGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0QXR0cmlidXRlKFwiZm9ybW1ldGhvZFwiKSkgfHwgdGhpcy5mb3JtRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJtZXRob2RcIikgfHwgXCJcIjtcbiAgICAgICAgcmV0dXJuIGZldGNoTWV0aG9kRnJvbVN0cmluZyhtZXRob2QudG9Mb3dlckNhc2UoKSkgfHwgRmV0Y2hNZXRob2QuZ2V0O1xuICAgIH1cbiAgICBnZXQgYWN0aW9uKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGZvcm1FbGVtZW50QWN0aW9uID0gdHlwZW9mIHRoaXMuZm9ybUVsZW1lbnQuYWN0aW9uID09PSAnc3RyaW5nJyA/IHRoaXMuZm9ybUVsZW1lbnQuYWN0aW9uIDogbnVsbDtcbiAgICAgICAgcmV0dXJuICgoX2EgPSB0aGlzLnN1Ym1pdHRlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmdldEF0dHJpYnV0ZShcImZvcm1hY3Rpb25cIikpIHx8IHRoaXMuZm9ybUVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiYWN0aW9uXCIpIHx8IGZvcm1FbGVtZW50QWN0aW9uIHx8IFwiXCI7XG4gICAgfVxuICAgIGdldCBsb2NhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGV4cGFuZFVSTCh0aGlzLmFjdGlvbik7XG4gICAgfVxuICAgIGdldCBib2R5KCkge1xuICAgICAgICBpZiAodGhpcy5lbmN0eXBlID09IEZvcm1FbmN0eXBlLnVybEVuY29kZWQgfHwgdGhpcy5tZXRob2QgPT0gRmV0Y2hNZXRob2QuZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtcyh0aGlzLnN0cmluZ0Zvcm1EYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1EYXRhO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBlbmN0eXBlKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiBmb3JtRW5jdHlwZUZyb21TdHJpbmcoKChfYSA9IHRoaXMuc3VibWl0dGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0QXR0cmlidXRlKFwiZm9ybWVuY3R5cGVcIikpIHx8IHRoaXMuZm9ybUVsZW1lbnQuZW5jdHlwZSk7XG4gICAgfVxuICAgIGdldCBpc0lkZW1wb3RlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoUmVxdWVzdC5pc0lkZW1wb3RlbnQ7XG4gICAgfVxuICAgIGdldCBzdHJpbmdGb3JtRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLmZvcm1EYXRhXS5yZWR1Y2UoKGVudHJpZXMsIFtuYW1lLCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBlbnRyaWVzLmNvbmNhdCh0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiA/IFtbbmFtZSwgdmFsdWVdXSA6IFtdKTtcbiAgICAgICAgfSwgW10pO1xuICAgIH1cbiAgICBhc3luYyBzdGFydCgpIHtcbiAgICAgICAgY29uc3QgeyBpbml0aWFsaXplZCwgcmVxdWVzdGluZyB9ID0gRm9ybVN1Ym1pc3Npb25TdGF0ZTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT0gaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSByZXF1ZXN0aW5nO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hSZXF1ZXN0LnBlcmZvcm0oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICBjb25zdCB7IHN0b3BwaW5nLCBzdG9wcGVkIH0gPSBGb3JtU3VibWlzc2lvblN0YXRlO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPSBzdG9wcGluZyAmJiB0aGlzLnN0YXRlICE9IHN0b3BwZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdG9wcGluZztcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hSZXF1ZXN0LmNhbmNlbCgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJlcGFyZUhlYWRlcnNGb3JSZXF1ZXN0KGhlYWRlcnMsIHJlcXVlc3QpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0LmlzSWRlbXBvdGVudCkge1xuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSBnZXRDb29raWVWYWx1ZShnZXRNZXRhQ29udGVudChcImNzcmYtcGFyYW1cIikpIHx8IGdldE1ldGFDb250ZW50KFwiY3NyZi10b2tlblwiKTtcbiAgICAgICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgICAgIGhlYWRlcnNbXCJYLUNTUkYtVG9rZW5cIl0gPSB0b2tlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhlYWRlcnNbXCJBY2NlcHRcIl0gPSBbU3RyZWFtTWVzc2FnZS5jb250ZW50VHlwZSwgaGVhZGVyc1tcIkFjY2VwdFwiXV0uam9pbihcIiwgXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlcXVlc3RTdGFydGVkKHJlcXVlc3QpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IEZvcm1TdWJtaXNzaW9uU3RhdGUud2FpdGluZztcbiAgICAgICAgZGlzcGF0Y2goXCJ0dXJibzpzdWJtaXQtc3RhcnRcIiwgeyB0YXJnZXQ6IHRoaXMuZm9ybUVsZW1lbnQsIGRldGFpbDogeyBmb3JtU3VibWlzc2lvbjogdGhpcyB9IH0pO1xuICAgICAgICB0aGlzLmRlbGVnYXRlLmZvcm1TdWJtaXNzaW9uU3RhcnRlZCh0aGlzKTtcbiAgICB9XG4gICAgcmVxdWVzdFByZXZlbnRlZEhhbmRsaW5nUmVzcG9uc2UocmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5yZXN1bHQgPSB7IHN1Y2Nlc3M6IHJlc3BvbnNlLnN1Y2NlZWRlZCwgZmV0Y2hSZXNwb25zZTogcmVzcG9uc2UgfTtcbiAgICB9XG4gICAgcmVxdWVzdFN1Y2NlZWRlZFdpdGhSZXNwb25zZShyZXF1ZXN0LCByZXNwb25zZSkge1xuICAgICAgICBpZiAocmVzcG9uc2UuY2xpZW50RXJyb3IgfHwgcmVzcG9uc2Uuc2VydmVyRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUuZm9ybVN1Ym1pc3Npb25GYWlsZWRXaXRoUmVzcG9uc2UodGhpcywgcmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucmVxdWVzdE11c3RSZWRpcmVjdChyZXF1ZXN0KSAmJiByZXNwb25zZVN1Y2NlZWRlZFdpdGhvdXRSZWRpcmVjdChyZXNwb25zZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKFwiRm9ybSByZXNwb25zZXMgbXVzdCByZWRpcmVjdCB0byBhbm90aGVyIGxvY2F0aW9uXCIpO1xuICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5mb3JtU3VibWlzc2lvbkVycm9yZWQodGhpcywgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IEZvcm1TdWJtaXNzaW9uU3RhdGUucmVjZWl2aW5nO1xuICAgICAgICAgICAgdGhpcy5yZXN1bHQgPSB7IHN1Y2Nlc3M6IHRydWUsIGZldGNoUmVzcG9uc2U6IHJlc3BvbnNlIH07XG4gICAgICAgICAgICB0aGlzLmRlbGVnYXRlLmZvcm1TdWJtaXNzaW9uU3VjY2VlZGVkV2l0aFJlc3BvbnNlKHRoaXMsIHJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXF1ZXN0RmFpbGVkV2l0aFJlc3BvbnNlKHJlcXVlc3QsIHJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMucmVzdWx0ID0geyBzdWNjZXNzOiBmYWxzZSwgZmV0Y2hSZXNwb25zZTogcmVzcG9uc2UgfTtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZS5mb3JtU3VibWlzc2lvbkZhaWxlZFdpdGhSZXNwb25zZSh0aGlzLCByZXNwb25zZSk7XG4gICAgfVxuICAgIHJlcXVlc3RFcnJvcmVkKHJlcXVlc3QsIGVycm9yKSB7XG4gICAgICAgIHRoaXMucmVzdWx0ID0geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3IgfTtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZS5mb3JtU3VibWlzc2lvbkVycm9yZWQodGhpcywgZXJyb3IpO1xuICAgIH1cbiAgICByZXF1ZXN0RmluaXNoZWQocmVxdWVzdCkge1xuICAgICAgICB0aGlzLnN0YXRlID0gRm9ybVN1Ym1pc3Npb25TdGF0ZS5zdG9wcGVkO1xuICAgICAgICBkaXNwYXRjaChcInR1cmJvOnN1Ym1pdC1lbmRcIiwgeyB0YXJnZXQ6IHRoaXMuZm9ybUVsZW1lbnQsIGRldGFpbDogT2JqZWN0LmFzc2lnbih7IGZvcm1TdWJtaXNzaW9uOiB0aGlzIH0sIHRoaXMucmVzdWx0KSB9KTtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZS5mb3JtU3VibWlzc2lvbkZpbmlzaGVkKHRoaXMpO1xuICAgIH1cbiAgICByZXF1ZXN0TXVzdFJlZGlyZWN0KHJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuICFyZXF1ZXN0LmlzSWRlbXBvdGVudCAmJiB0aGlzLm11c3RSZWRpcmVjdDtcbiAgICB9XG59XG5mdW5jdGlvbiBidWlsZEZvcm1EYXRhKGZvcm1FbGVtZW50LCBzdWJtaXR0ZXIpIHtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtRWxlbWVudCk7XG4gICAgY29uc3QgbmFtZSA9IHN1Ym1pdHRlciA9PT0gbnVsbCB8fCBzdWJtaXR0ZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN1Ym1pdHRlci5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpO1xuICAgIGNvbnN0IHZhbHVlID0gc3VibWl0dGVyID09PSBudWxsIHx8IHN1Ym1pdHRlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3VibWl0dGVyLmdldEF0dHJpYnV0ZShcInZhbHVlXCIpO1xuICAgIGlmIChuYW1lICYmIHZhbHVlICE9IG51bGwgJiYgZm9ybURhdGEuZ2V0KG5hbWUpICE9IHZhbHVlKSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBmb3JtRGF0YTtcbn1cbmZ1bmN0aW9uIGdldENvb2tpZVZhbHVlKGNvb2tpZU5hbWUpIHtcbiAgICBpZiAoY29va2llTmFtZSAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGNvb2tpZXMgPSBkb2N1bWVudC5jb29raWUgPyBkb2N1bWVudC5jb29raWUuc3BsaXQoXCI7IFwiKSA6IFtdO1xuICAgICAgICBjb25zdCBjb29raWUgPSBjb29raWVzLmZpbmQoKGNvb2tpZSkgPT4gY29va2llLnN0YXJ0c1dpdGgoY29va2llTmFtZSkpO1xuICAgICAgICBpZiAoY29va2llKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvb2tpZS5zcGxpdChcIj1cIikuc2xpY2UoMSkuam9pbihcIj1cIik7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgPyBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0TWV0YUNvbnRlbnQobmFtZSkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBtZXRhW25hbWU9XCIke25hbWV9XCJdYCk7XG4gICAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC5jb250ZW50O1xufVxuZnVuY3Rpb24gcmVzcG9uc2VTdWNjZWVkZWRXaXRob3V0UmVkaXJlY3QocmVzcG9uc2UpIHtcbiAgICByZXR1cm4gcmVzcG9uc2Uuc3RhdHVzQ29kZSA9PSAyMDAgJiYgIXJlc3BvbnNlLnJlZGlyZWN0ZWQ7XG59XG5cbmNsYXNzIFNuYXBzaG90IHtcbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50KSB7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgfVxuICAgIGdldCBjaGlsZHJlbigpIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLmVsZW1lbnQuY2hpbGRyZW5dO1xuICAgIH1cbiAgICBoYXNBbmNob3IoYW5jaG9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEVsZW1lbnRGb3JBbmNob3IoYW5jaG9yKSAhPSBudWxsO1xuICAgIH1cbiAgICBnZXRFbGVtZW50Rm9yQW5jaG9yKGFuY2hvcikge1xuICAgICAgICByZXR1cm4gYW5jaG9yID8gdGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYFtpZD0nJHthbmNob3J9J10sIGFbbmFtZT0nJHthbmNob3J9J11gKSA6IG51bGw7XG4gICAgfVxuICAgIGdldCBpc0Nvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5pc0Nvbm5lY3RlZDtcbiAgICB9XG4gICAgZ2V0IGZpcnN0QXV0b2ZvY3VzYWJsZUVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvcihcIlthdXRvZm9jdXNdXCIpO1xuICAgIH1cbiAgICBnZXQgcGVybWFuZW50RWxlbWVudHMoKSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaWRdW2RhdGEtdHVyYm8tcGVybWFuZW50XVwiKV07XG4gICAgfVxuICAgIGdldFBlcm1hbmVudEVsZW1lbnRCeUlkKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvcihgIyR7aWR9W2RhdGEtdHVyYm8tcGVybWFuZW50XWApO1xuICAgIH1cbiAgICBnZXRQZXJtYW5lbnRFbGVtZW50TWFwRm9yU25hcHNob3Qoc25hcHNob3QpIHtcbiAgICAgICAgY29uc3QgcGVybWFuZW50RWxlbWVudE1hcCA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGN1cnJlbnRQZXJtYW5lbnRFbGVtZW50IG9mIHRoaXMucGVybWFuZW50RWxlbWVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgaWQgfSA9IGN1cnJlbnRQZXJtYW5lbnRFbGVtZW50O1xuICAgICAgICAgICAgY29uc3QgbmV3UGVybWFuZW50RWxlbWVudCA9IHNuYXBzaG90LmdldFBlcm1hbmVudEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgICAgICAgIGlmIChuZXdQZXJtYW5lbnRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcGVybWFuZW50RWxlbWVudE1hcFtpZF0gPSBbY3VycmVudFBlcm1hbmVudEVsZW1lbnQsIG5ld1Blcm1hbmVudEVsZW1lbnRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwZXJtYW5lbnRFbGVtZW50TWFwO1xuICAgIH1cbn1cblxuY2xhc3MgRm9ybUludGVyY2VwdG9yIHtcbiAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSwgZWxlbWVudCkge1xuICAgICAgICB0aGlzLnN1Ym1pdEJ1YmJsZWQgPSAoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybSA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJtaXR0ZXIgPSBldmVudC5zdWJtaXR0ZXIgfHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlbGVnYXRlLnNob3VsZEludGVyY2VwdEZvcm1TdWJtaXNzaW9uKGZvcm0sIHN1Ym1pdHRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUuZm9ybVN1Ym1pc3Npb25JbnRlcmNlcHRlZChmb3JtLCBzdWJtaXR0ZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICB9XG4gICAgc3RhcnQoKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIHRoaXMuc3VibWl0QnViYmxlZCk7XG4gICAgfVxuICAgIHN0b3AoKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIHRoaXMuc3VibWl0QnViYmxlZCk7XG4gICAgfVxufVxuXG5jbGFzcyBWaWV3IHtcbiAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSwgZWxlbWVudCkge1xuICAgICAgICB0aGlzLnJlc29sdmVSZW5kZXJQcm9taXNlID0gKHZhbHVlKSA9PiB7IH07XG4gICAgICAgIHRoaXMucmVzb2x2ZUludGVyY2VwdGlvblByb21pc2UgPSAodmFsdWUpID0+IHsgfTtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIH1cbiAgICBzY3JvbGxUb0FuY2hvcihhbmNob3IpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuc25hcHNob3QuZ2V0RWxlbWVudEZvckFuY2hvcihhbmNob3IpO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0VsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9Qb3NpdGlvbih7IHg6IDAsIHk6IDAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2Nyb2xsVG9BbmNob3JGcm9tTG9jYXRpb24obG9jYXRpb24pIHtcbiAgICAgICAgdGhpcy5zY3JvbGxUb0FuY2hvcihnZXRBbmNob3IobG9jYXRpb24pKTtcbiAgICB9XG4gICAgc2Nyb2xsVG9FbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5zY3JvbGxJbnRvVmlldygpO1xuICAgIH1cbiAgICBmb2N1c0VsZW1lbnQoZWxlbWVudCkge1xuICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCItMVwiKTtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBzY3JvbGxUb1Bvc2l0aW9uKHsgeCwgeSB9KSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsUm9vdC5zY3JvbGxUbyh4LCB5KTtcbiAgICB9XG4gICAgc2Nyb2xsVG9Ub3AoKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Qb3NpdGlvbih7IHg6IDAsIHk6IDAgfSk7XG4gICAgfVxuICAgIGdldCBzY3JvbGxSb290KCkge1xuICAgICAgICByZXR1cm4gd2luZG93O1xuICAgIH1cbiAgICBhc3luYyByZW5kZXIocmVuZGVyZXIpIHtcbiAgICAgICAgY29uc3QgeyBpc1ByZXZpZXcsIHNob3VsZFJlbmRlciwgbmV3U25hcHNob3Q6IHNuYXBzaG90IH0gPSByZW5kZXJlcjtcbiAgICAgICAgaWYgKHNob3VsZFJlbmRlcikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHRoaXMucmVzb2x2ZVJlbmRlclByb21pc2UgPSByZXNvbHZlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVwYXJlVG9SZW5kZXJTbmFwc2hvdChyZW5kZXJlcik7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVuZGVySW50ZXJjZXB0aW9uID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB0aGlzLnJlc29sdmVJbnRlcmNlcHRpb25Qcm9taXNlID0gcmVzb2x2ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1tZWRpYXRlUmVuZGVyID0gdGhpcy5kZWxlZ2F0ZS5hbGxvd3NJbW1lZGlhdGVSZW5kZXIoc25hcHNob3QsIHRoaXMucmVzb2x2ZUludGVyY2VwdGlvblByb21pc2UpO1xuICAgICAgICAgICAgICAgIGlmICghaW1tZWRpYXRlUmVuZGVyKVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCByZW5kZXJJbnRlcmNlcHRpb247XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJTbmFwc2hvdChyZW5kZXJlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS52aWV3UmVuZGVyZWRTbmFwc2hvdChzbmFwc2hvdCwgaXNQcmV2aWV3KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaFJlbmRlcmluZ1NuYXBzaG90KHJlbmRlcmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnJlbmRlcmVyO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZVJlbmRlclByb21pc2UodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5yZW5kZXJQcm9taXNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW52YWxpZGF0ZSgpIHtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZS52aWV3SW52YWxpZGF0ZWQoKTtcbiAgICB9XG4gICAgcHJlcGFyZVRvUmVuZGVyU25hcHNob3QocmVuZGVyZXIpIHtcbiAgICAgICAgdGhpcy5tYXJrQXNQcmV2aWV3KHJlbmRlcmVyLmlzUHJldmlldyk7XG4gICAgICAgIHJlbmRlcmVyLnByZXBhcmVUb1JlbmRlcigpO1xuICAgIH1cbiAgICBtYXJrQXNQcmV2aWV3KGlzUHJldmlldykge1xuICAgICAgICBpZiAoaXNQcmV2aWV3KSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS10dXJiby1wcmV2aWV3XCIsIFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtdHVyYm8tcHJldmlld1wiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyByZW5kZXJTbmFwc2hvdChyZW5kZXJlcikge1xuICAgICAgICBhd2FpdCByZW5kZXJlci5yZW5kZXIoKTtcbiAgICB9XG4gICAgZmluaXNoUmVuZGVyaW5nU25hcHNob3QocmVuZGVyZXIpIHtcbiAgICAgICAgcmVuZGVyZXIuZmluaXNoUmVuZGVyaW5nKCk7XG4gICAgfVxufVxuXG5jbGFzcyBGcmFtZVZpZXcgZXh0ZW5kcyBWaWV3IHtcbiAgICBpbnZhbGlkYXRlKCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQuaW5uZXJIVE1MID0gXCJcIjtcbiAgICB9XG4gICAgZ2V0IHNuYXBzaG90KCkge1xuICAgICAgICByZXR1cm4gbmV3IFNuYXBzaG90KHRoaXMuZWxlbWVudCk7XG4gICAgfVxufVxuXG5jbGFzcyBMaW5rSW50ZXJjZXB0b3Ige1xuICAgIGNvbnN0cnVjdG9yKGRlbGVnYXRlLCBlbGVtZW50KSB7XG4gICAgICAgIHRoaXMuY2xpY2tCdWJibGVkID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5yZXNwb25kc1RvRXZlbnRUYXJnZXQoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xpY2tFdmVudCA9IGV2ZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2xpY2tFdmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5saW5rQ2xpY2tlZCA9ICgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNsaWNrRXZlbnQgJiYgdGhpcy5yZXNwb25kc1RvRXZlbnRUYXJnZXQoZXZlbnQudGFyZ2V0KSAmJiBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVsZWdhdGUuc2hvdWxkSW50ZXJjZXB0TGlua0NsaWNrKGV2ZW50LnRhcmdldCwgZXZlbnQuZGV0YWlsLnVybCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGlja0V2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUubGlua0NsaWNrSW50ZXJjZXB0ZWQoZXZlbnQudGFyZ2V0LCBldmVudC5kZXRhaWwudXJsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jbGlja0V2ZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy53aWxsVmlzaXQgPSAoKSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jbGlja0V2ZW50O1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgfVxuICAgIHN0YXJ0KCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuY2xpY2tCdWJibGVkKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInR1cmJvOmNsaWNrXCIsIHRoaXMubGlua0NsaWNrZWQpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidHVyYm86YmVmb3JlLXZpc2l0XCIsIHRoaXMud2lsbFZpc2l0KTtcbiAgICB9XG4gICAgc3RvcCgpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLmNsaWNrQnViYmxlZCk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0dXJibzpjbGlja1wiLCB0aGlzLmxpbmtDbGlja2VkKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInR1cmJvOmJlZm9yZS12aXNpdFwiLCB0aGlzLndpbGxWaXNpdCk7XG4gICAgfVxuICAgIHJlc3BvbmRzVG9FdmVudFRhcmdldCh0YXJnZXQpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnRcbiAgICAgICAgICAgID8gdGFyZ2V0XG4gICAgICAgICAgICA6IHRhcmdldCBpbnN0YW5jZW9mIE5vZGVcbiAgICAgICAgICAgICAgICA/IHRhcmdldC5wYXJlbnRFbGVtZW50XG4gICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICByZXR1cm4gZWxlbWVudCAmJiBlbGVtZW50LmNsb3Nlc3QoXCJ0dXJiby1mcmFtZSwgaHRtbFwiKSA9PSB0aGlzLmVsZW1lbnQ7XG4gICAgfVxufVxuXG5jbGFzcyBCYXJkbyB7XG4gICAgY29uc3RydWN0b3IocGVybWFuZW50RWxlbWVudE1hcCkge1xuICAgICAgICB0aGlzLnBlcm1hbmVudEVsZW1lbnRNYXAgPSBwZXJtYW5lbnRFbGVtZW50TWFwO1xuICAgIH1cbiAgICBzdGF0aWMgcHJlc2VydmluZ1Blcm1hbmVudEVsZW1lbnRzKHBlcm1hbmVudEVsZW1lbnRNYXAsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGJhcmRvID0gbmV3IHRoaXMocGVybWFuZW50RWxlbWVudE1hcCk7XG4gICAgICAgIGJhcmRvLmVudGVyKCk7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIGJhcmRvLmxlYXZlKCk7XG4gICAgfVxuICAgIGVudGVyKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMucGVybWFuZW50RWxlbWVudE1hcCkge1xuICAgICAgICAgICAgY29uc3QgWywgbmV3UGVybWFuZW50RWxlbWVudF0gPSB0aGlzLnBlcm1hbmVudEVsZW1lbnRNYXBbaWRdO1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlTmV3UGVybWFuZW50RWxlbWVudFdpdGhQbGFjZWhvbGRlcihuZXdQZXJtYW5lbnRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZWF2ZSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLnBlcm1hbmVudEVsZW1lbnRNYXApIHtcbiAgICAgICAgICAgIGNvbnN0IFtjdXJyZW50UGVybWFuZW50RWxlbWVudF0gPSB0aGlzLnBlcm1hbmVudEVsZW1lbnRNYXBbaWRdO1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlQ3VycmVudFBlcm1hbmVudEVsZW1lbnRXaXRoQ2xvbmUoY3VycmVudFBlcm1hbmVudEVsZW1lbnQpO1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlUGxhY2Vob2xkZXJXaXRoUGVybWFuZW50RWxlbWVudChjdXJyZW50UGVybWFuZW50RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVwbGFjZU5ld1Blcm1hbmVudEVsZW1lbnRXaXRoUGxhY2Vob2xkZXIocGVybWFuZW50RWxlbWVudCkge1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlciA9IGNyZWF0ZVBsYWNlaG9sZGVyRm9yUGVybWFuZW50RWxlbWVudChwZXJtYW5lbnRFbGVtZW50KTtcbiAgICAgICAgcGVybWFuZW50RWxlbWVudC5yZXBsYWNlV2l0aChwbGFjZWhvbGRlcik7XG4gICAgfVxuICAgIHJlcGxhY2VDdXJyZW50UGVybWFuZW50RWxlbWVudFdpdGhDbG9uZShwZXJtYW5lbnRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGNsb25lID0gcGVybWFuZW50RWxlbWVudC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgIHBlcm1hbmVudEVsZW1lbnQucmVwbGFjZVdpdGgoY2xvbmUpO1xuICAgIH1cbiAgICByZXBsYWNlUGxhY2Vob2xkZXJXaXRoUGVybWFuZW50RWxlbWVudChwZXJtYW5lbnRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gdGhpcy5nZXRQbGFjZWhvbGRlckJ5SWQocGVybWFuZW50RWxlbWVudC5pZCk7XG4gICAgICAgIHBsYWNlaG9sZGVyID09PSBudWxsIHx8IHBsYWNlaG9sZGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwbGFjZWhvbGRlci5yZXBsYWNlV2l0aChwZXJtYW5lbnRFbGVtZW50KTtcbiAgICB9XG4gICAgZ2V0UGxhY2Vob2xkZXJCeUlkKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYWNlaG9sZGVycy5maW5kKGVsZW1lbnQgPT4gZWxlbWVudC5jb250ZW50ID09IGlkKTtcbiAgICB9XG4gICAgZ2V0IHBsYWNlaG9sZGVycygpIHtcbiAgICAgICAgcmV0dXJuIFsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwibWV0YVtuYW1lPXR1cmJvLXBlcm1hbmVudC1wbGFjZWhvbGRlcl1bY29udGVudF1cIildO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZVBsYWNlaG9sZGVyRm9yUGVybWFuZW50RWxlbWVudChwZXJtYW5lbnRFbGVtZW50KSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJtZXRhXCIpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwibmFtZVwiLCBcInR1cmJvLXBlcm1hbmVudC1wbGFjZWhvbGRlclwiKTtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImNvbnRlbnRcIiwgcGVybWFuZW50RWxlbWVudC5pZCk7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG59XG5cbmNsYXNzIFJlbmRlcmVyIHtcbiAgICBjb25zdHJ1Y3RvcihjdXJyZW50U25hcHNob3QsIG5ld1NuYXBzaG90LCBpc1ByZXZpZXcpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U25hcHNob3QgPSBjdXJyZW50U25hcHNob3Q7XG4gICAgICAgIHRoaXMubmV3U25hcHNob3QgPSBuZXdTbmFwc2hvdDtcbiAgICAgICAgdGhpcy5pc1ByZXZpZXcgPSBpc1ByZXZpZXc7XG4gICAgICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHRoaXMucmVzb2x2aW5nRnVuY3Rpb25zID0geyByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgfVxuICAgIGdldCBzaG91bGRSZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBwcmVwYXJlVG9SZW5kZXIoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZmluaXNoUmVuZGVyaW5nKCkge1xuICAgICAgICBpZiAodGhpcy5yZXNvbHZpbmdGdW5jdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMucmVzb2x2aW5nRnVuY3Rpb25zLnJlc29sdmUoKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnJlc29sdmluZ0Z1bmN0aW9ucztcbiAgICAgICAgfVxuICAgIH1cbiAgICBjcmVhdGVTY3JpcHRFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS10dXJiby1ldmFsXCIpID09IFwiZmFsc2VcIikge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkU2NyaXB0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICAgICAgICBpZiAodGhpcy5jc3BOb25jZSkge1xuICAgICAgICAgICAgICAgIGNyZWF0ZWRTY3JpcHRFbGVtZW50Lm5vbmNlID0gdGhpcy5jc3BOb25jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNyZWF0ZWRTY3JpcHRFbGVtZW50LnRleHRDb250ZW50ID0gZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICAgICAgICAgIGNyZWF0ZWRTY3JpcHRFbGVtZW50LmFzeW5jID0gZmFsc2U7XG4gICAgICAgICAgICBjb3B5RWxlbWVudEF0dHJpYnV0ZXMoY3JlYXRlZFNjcmlwdEVsZW1lbnQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZWRTY3JpcHRFbGVtZW50O1xuICAgICAgICB9XG4gICAgfVxuICAgIHByZXNlcnZpbmdQZXJtYW5lbnRFbGVtZW50cyhjYWxsYmFjaykge1xuICAgICAgICBCYXJkby5wcmVzZXJ2aW5nUGVybWFuZW50RWxlbWVudHModGhpcy5wZXJtYW5lbnRFbGVtZW50TWFwLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIGZvY3VzRmlyc3RBdXRvZm9jdXNhYmxlRWxlbWVudCgpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuY29ubmVjdGVkU25hcHNob3QuZmlyc3RBdXRvZm9jdXNhYmxlRWxlbWVudDtcbiAgICAgICAgaWYgKGVsZW1lbnRJc0ZvY3VzYWJsZShlbGVtZW50KSkge1xuICAgICAgICAgICAgZWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBjb25uZWN0ZWRTbmFwc2hvdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV3U25hcHNob3QuaXNDb25uZWN0ZWQgPyB0aGlzLm5ld1NuYXBzaG90IDogdGhpcy5jdXJyZW50U25hcHNob3Q7XG4gICAgfVxuICAgIGdldCBjdXJyZW50RWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFNuYXBzaG90LmVsZW1lbnQ7XG4gICAgfVxuICAgIGdldCBuZXdFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXdTbmFwc2hvdC5lbGVtZW50O1xuICAgIH1cbiAgICBnZXQgcGVybWFuZW50RWxlbWVudE1hcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFNuYXBzaG90LmdldFBlcm1hbmVudEVsZW1lbnRNYXBGb3JTbmFwc2hvdCh0aGlzLm5ld1NuYXBzaG90KTtcbiAgICB9XG4gICAgZ2V0IGNzcE5vbmNlKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImNzcC1ub25jZVwiXScpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjb3B5RWxlbWVudEF0dHJpYnV0ZXMoZGVzdGluYXRpb25FbGVtZW50LCBzb3VyY2VFbGVtZW50KSB7XG4gICAgZm9yIChjb25zdCB7IG5hbWUsIHZhbHVlIH0gb2YgWy4uLnNvdXJjZUVsZW1lbnQuYXR0cmlidXRlc10pIHtcbiAgICAgICAgZGVzdGluYXRpb25FbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gZWxlbWVudElzRm9jdXNhYmxlKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gZWxlbWVudCAmJiB0eXBlb2YgZWxlbWVudC5mb2N1cyA9PSBcImZ1bmN0aW9uXCI7XG59XG5cbmNsYXNzIEZyYW1lUmVuZGVyZXIgZXh0ZW5kcyBSZW5kZXJlciB7XG4gICAgZ2V0IHNob3VsZFJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGFzeW5jIHJlbmRlcigpIHtcbiAgICAgICAgYXdhaXQgbmV4dEFuaW1hdGlvbkZyYW1lKCk7XG4gICAgICAgIHRoaXMucHJlc2VydmluZ1Blcm1hbmVudEVsZW1lbnRzKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZEZyYW1lRWxlbWVudCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zY3JvbGxGcmFtZUludG9WaWV3KCk7XG4gICAgICAgIGF3YWl0IG5leHRBbmltYXRpb25GcmFtZSgpO1xuICAgICAgICB0aGlzLmZvY3VzRmlyc3RBdXRvZm9jdXNhYmxlRWxlbWVudCgpO1xuICAgICAgICBhd2FpdCBuZXh0QW5pbWF0aW9uRnJhbWUoKTtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZVNjcmlwdEVsZW1lbnRzKCk7XG4gICAgfVxuICAgIGxvYWRGcmFtZUVsZW1lbnQoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb25SYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIGRlc3RpbmF0aW9uUmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKHRoaXMuY3VycmVudEVsZW1lbnQpO1xuICAgICAgICBkZXN0aW5hdGlvblJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XG4gICAgICAgIGNvbnN0IGZyYW1lRWxlbWVudCA9IHRoaXMubmV3RWxlbWVudDtcbiAgICAgICAgY29uc3Qgc291cmNlUmFuZ2UgPSAoX2EgPSBmcmFtZUVsZW1lbnQub3duZXJEb2N1bWVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIGlmIChzb3VyY2VSYW5nZSkge1xuICAgICAgICAgICAgc291cmNlUmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGZyYW1lRWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRFbGVtZW50LmFwcGVuZENoaWxkKHNvdXJjZVJhbmdlLmV4dHJhY3RDb250ZW50cygpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzY3JvbGxGcmFtZUludG9WaWV3KCkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50RWxlbWVudC5hdXRvc2Nyb2xsIHx8IHRoaXMubmV3RWxlbWVudC5hdXRvc2Nyb2xsKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5jdXJyZW50RWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrID0gcmVhZFNjcm9sbExvZ2ljYWxQb3NpdGlvbih0aGlzLmN1cnJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtYXV0b3Njcm9sbC1ibG9ja1wiKSwgXCJlbmRcIik7XG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jayB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGFjdGl2YXRlU2NyaXB0RWxlbWVudHMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgaW5lcnRTY3JpcHRFbGVtZW50IG9mIHRoaXMubmV3U2NyaXB0RWxlbWVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2YXRlZFNjcmlwdEVsZW1lbnQgPSB0aGlzLmNyZWF0ZVNjcmlwdEVsZW1lbnQoaW5lcnRTY3JpcHRFbGVtZW50KTtcbiAgICAgICAgICAgIGluZXJ0U2NyaXB0RWxlbWVudC5yZXBsYWNlV2l0aChhY3RpdmF0ZWRTY3JpcHRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgbmV3U2NyaXB0RWxlbWVudHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzY3JpcHRcIik7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVhZFNjcm9sbExvZ2ljYWxQb3NpdGlvbih2YWx1ZSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IFwiZW5kXCIgfHwgdmFsdWUgPT0gXCJzdGFydFwiIHx8IHZhbHVlID09IFwiY2VudGVyXCIgfHwgdmFsdWUgPT0gXCJuZWFyZXN0XCIpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG59XG5cbmNsYXNzIFByb2dyZXNzQmFyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5oaWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IDA7XG4gICAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRyaWNrbGUgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRoaXMudmFsdWUgKyBNYXRoLnJhbmRvbSgpIC8gMTAwKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zdHlsZXNoZWV0RWxlbWVudCA9IHRoaXMuY3JlYXRlU3R5bGVzaGVldEVsZW1lbnQoKTtcbiAgICAgICAgdGhpcy5wcm9ncmVzc0VsZW1lbnQgPSB0aGlzLmNyZWF0ZVByb2dyZXNzRWxlbWVudCgpO1xuICAgICAgICB0aGlzLmluc3RhbGxTdHlsZXNoZWV0RWxlbWVudCgpO1xuICAgICAgICB0aGlzLnNldFZhbHVlKDApO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IGRlZmF1bHRDU1MoKSB7XG4gICAgICAgIHJldHVybiB1bmluZGVudCBgXG4gICAgICAudHVyYm8tcHJvZ3Jlc3MtYmFyIHtcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICBoZWlnaHQ6IDNweDtcbiAgICAgICAgYmFja2dyb3VuZDogIzAwNzZmZjtcbiAgICAgICAgei1pbmRleDogOTk5OTtcbiAgICAgICAgdHJhbnNpdGlvbjpcbiAgICAgICAgICB3aWR0aCAke1Byb2dyZXNzQmFyLmFuaW1hdGlvbkR1cmF0aW9ufW1zIGVhc2Utb3V0LFxuICAgICAgICAgIG9wYWNpdHkgJHtQcm9ncmVzc0Jhci5hbmltYXRpb25EdXJhdGlvbiAvIDJ9bXMgJHtQcm9ncmVzc0Jhci5hbmltYXRpb25EdXJhdGlvbiAvIDJ9bXMgZWFzZS1pbjtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICBzaG93KCkge1xuICAgICAgICBpZiAoIXRoaXMudmlzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuaW5zdGFsbFByb2dyZXNzRWxlbWVudCgpO1xuICAgICAgICAgICAgdGhpcy5zdGFydFRyaWNrbGluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhpZGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnZpc2libGUgJiYgIXRoaXMuaGlkaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmhpZGluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmZhZGVQcm9ncmVzc0VsZW1lbnQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudW5pbnN0YWxsUHJvZ3Jlc3NFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wVHJpY2tsaW5nKCk7XG4gICAgICAgICAgICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldFZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuICAgIGluc3RhbGxTdHlsZXNoZWV0RWxlbWVudCgpIHtcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUodGhpcy5zdHlsZXNoZWV0RWxlbWVudCwgZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgaW5zdGFsbFByb2dyZXNzRWxlbWVudCgpIHtcbiAgICAgICAgdGhpcy5wcm9ncmVzc0VsZW1lbnQuc3R5bGUud2lkdGggPSBcIjBcIjtcbiAgICAgICAgdGhpcy5wcm9ncmVzc0VsZW1lbnQuc3R5bGUub3BhY2l0eSA9IFwiMVwiO1xuICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMucHJvZ3Jlc3NFbGVtZW50LCBkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuICAgIGZhZGVQcm9ncmVzc0VsZW1lbnQoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5wcm9ncmVzc0VsZW1lbnQuc3R5bGUub3BhY2l0eSA9IFwiMFwiO1xuICAgICAgICBzZXRUaW1lb3V0KGNhbGxiYWNrLCBQcm9ncmVzc0Jhci5hbmltYXRpb25EdXJhdGlvbiAqIDEuNSk7XG4gICAgfVxuICAgIHVuaW5zdGFsbFByb2dyZXNzRWxlbWVudCgpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvZ3Jlc3NFbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLnByb2dyZXNzRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhcnRUcmlja2xpbmcoKSB7XG4gICAgICAgIGlmICghdGhpcy50cmlja2xlSW50ZXJ2YWwpIHtcbiAgICAgICAgICAgIHRoaXMudHJpY2tsZUludGVydmFsID0gd2luZG93LnNldEludGVydmFsKHRoaXMudHJpY2tsZSwgUHJvZ3Jlc3NCYXIuYW5pbWF0aW9uRHVyYXRpb24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0b3BUcmlja2xpbmcoKSB7XG4gICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMudHJpY2tsZUludGVydmFsKTtcbiAgICAgICAgZGVsZXRlIHRoaXMudHJpY2tsZUludGVydmFsO1xuICAgIH1cbiAgICByZWZyZXNoKCkge1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc0VsZW1lbnQuc3R5bGUud2lkdGggPSBgJHsxMCArICh0aGlzLnZhbHVlICogOTApfSVgO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY3JlYXRlU3R5bGVzaGVldEVsZW1lbnQoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gICAgICAgIGVsZW1lbnQudHlwZSA9IFwidGV4dC9jc3NcIjtcbiAgICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IFByb2dyZXNzQmFyLmRlZmF1bHRDU1M7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cbiAgICBjcmVhdGVQcm9ncmVzc0VsZW1lbnQoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBlbGVtZW50LmNsYXNzTmFtZSA9IFwidHVyYm8tcHJvZ3Jlc3MtYmFyXCI7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cbn1cblByb2dyZXNzQmFyLmFuaW1hdGlvbkR1cmF0aW9uID0gMzAwO1xuXG5jbGFzcyBIZWFkU25hcHNob3QgZXh0ZW5kcyBTbmFwc2hvdCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuZGV0YWlsc0J5T3V0ZXJIVE1MID0gdGhpcy5jaGlsZHJlblxuICAgICAgICAgICAgLmZpbHRlcigoZWxlbWVudCkgPT4gIWVsZW1lbnRJc05vc2NyaXB0KGVsZW1lbnQpKVxuICAgICAgICAgICAgLnJlZHVjZSgocmVzdWx0LCBlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IG91dGVySFRNTCB9ID0gZWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSBvdXRlckhUTUwgaW4gcmVzdWx0XG4gICAgICAgICAgICAgICAgPyByZXN1bHRbb3V0ZXJIVE1MXVxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBlbGVtZW50VHlwZShlbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgdHJhY2tlZDogZWxlbWVudElzVHJhY2tlZChlbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudHM6IFtdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc3VsdCksIHsgW291dGVySFRNTF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGV0YWlscyksIHsgZWxlbWVudHM6IFsuLi5kZXRhaWxzLmVsZW1lbnRzLCBlbGVtZW50XSB9KSB9KTtcbiAgICAgICAgfSwge30pO1xuICAgIH1cbiAgICBnZXQgdHJhY2tlZEVsZW1lbnRTaWduYXR1cmUoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmRldGFpbHNCeU91dGVySFRNTClcbiAgICAgICAgICAgIC5maWx0ZXIob3V0ZXJIVE1MID0+IHRoaXMuZGV0YWlsc0J5T3V0ZXJIVE1MW291dGVySFRNTF0udHJhY2tlZClcbiAgICAgICAgICAgIC5qb2luKFwiXCIpO1xuICAgIH1cbiAgICBnZXRTY3JpcHRFbGVtZW50c05vdEluU25hcHNob3Qoc25hcHNob3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RWxlbWVudHNNYXRjaGluZ1R5cGVOb3RJblNuYXBzaG90KFwic2NyaXB0XCIsIHNuYXBzaG90KTtcbiAgICB9XG4gICAgZ2V0U3R5bGVzaGVldEVsZW1lbnRzTm90SW5TbmFwc2hvdChzbmFwc2hvdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRFbGVtZW50c01hdGNoaW5nVHlwZU5vdEluU25hcHNob3QoXCJzdHlsZXNoZWV0XCIsIHNuYXBzaG90KTtcbiAgICB9XG4gICAgZ2V0RWxlbWVudHNNYXRjaGluZ1R5cGVOb3RJblNuYXBzaG90KG1hdGNoZWRUeXBlLCBzbmFwc2hvdCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5kZXRhaWxzQnlPdXRlckhUTUwpXG4gICAgICAgICAgICAuZmlsdGVyKG91dGVySFRNTCA9PiAhKG91dGVySFRNTCBpbiBzbmFwc2hvdC5kZXRhaWxzQnlPdXRlckhUTUwpKVxuICAgICAgICAgICAgLm1hcChvdXRlckhUTUwgPT4gdGhpcy5kZXRhaWxzQnlPdXRlckhUTUxbb3V0ZXJIVE1MXSlcbiAgICAgICAgICAgIC5maWx0ZXIoKHsgdHlwZSB9KSA9PiB0eXBlID09IG1hdGNoZWRUeXBlKVxuICAgICAgICAgICAgLm1hcCgoeyBlbGVtZW50czogW2VsZW1lbnRdIH0pID0+IGVsZW1lbnQpO1xuICAgIH1cbiAgICBnZXQgcHJvdmlzaW9uYWxFbGVtZW50cygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZGV0YWlsc0J5T3V0ZXJIVE1MKS5yZWR1Y2UoKHJlc3VsdCwgb3V0ZXJIVE1MKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHR5cGUsIHRyYWNrZWQsIGVsZW1lbnRzIH0gPSB0aGlzLmRldGFpbHNCeU91dGVySFRNTFtvdXRlckhUTUxdO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCAmJiAhdHJhY2tlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbLi4ucmVzdWx0LCAuLi5lbGVtZW50c107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsuLi5yZXN1bHQsIC4uLmVsZW1lbnRzLnNsaWNlKDEpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIFtdKTtcbiAgICB9XG4gICAgZ2V0TWV0YVZhbHVlKG5hbWUpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZmluZE1ldGFFbGVtZW50QnlOYW1lKG5hbWUpO1xuICAgICAgICByZXR1cm4gZWxlbWVudFxuICAgICAgICAgICAgPyBlbGVtZW50LmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIilcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICB9XG4gICAgZmluZE1ldGFFbGVtZW50QnlOYW1lKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZGV0YWlsc0J5T3V0ZXJIVE1MKS5yZWR1Y2UoKHJlc3VsdCwgb3V0ZXJIVE1MKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGVsZW1lbnRzOiBbZWxlbWVudF0gfSA9IHRoaXMuZGV0YWlsc0J5T3V0ZXJIVE1MW291dGVySFRNTF07XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudElzTWV0YUVsZW1lbnRXaXRoTmFtZShlbGVtZW50LCBuYW1lKSA/IGVsZW1lbnQgOiByZXN1bHQ7XG4gICAgICAgIH0sIHVuZGVmaW5lZCk7XG4gICAgfVxufVxuZnVuY3Rpb24gZWxlbWVudFR5cGUoZWxlbWVudCkge1xuICAgIGlmIChlbGVtZW50SXNTY3JpcHQoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIFwic2NyaXB0XCI7XG4gICAgfVxuICAgIGVsc2UgaWYgKGVsZW1lbnRJc1N0eWxlc2hlZXQoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIFwic3R5bGVzaGVldFwiO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGVsZW1lbnRJc1RyYWNrZWQoZWxlbWVudCkge1xuICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtdHVyYm8tdHJhY2tcIikgPT0gXCJyZWxvYWRcIjtcbn1cbmZ1bmN0aW9uIGVsZW1lbnRJc1NjcmlwdChlbGVtZW50KSB7XG4gICAgY29uc3QgdGFnTmFtZSA9IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiB0YWdOYW1lID09IFwic2NyaXB0XCI7XG59XG5mdW5jdGlvbiBlbGVtZW50SXNOb3NjcmlwdChlbGVtZW50KSB7XG4gICAgY29uc3QgdGFnTmFtZSA9IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiB0YWdOYW1lID09IFwibm9zY3JpcHRcIjtcbn1cbmZ1bmN0aW9uIGVsZW1lbnRJc1N0eWxlc2hlZXQoZWxlbWVudCkge1xuICAgIGNvbnN0IHRhZ05hbWUgPSBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gdGFnTmFtZSA9PSBcInN0eWxlXCIgfHwgKHRhZ05hbWUgPT0gXCJsaW5rXCIgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJyZWxcIikgPT0gXCJzdHlsZXNoZWV0XCIpO1xufVxuZnVuY3Rpb24gZWxlbWVudElzTWV0YUVsZW1lbnRXaXRoTmFtZShlbGVtZW50LCBuYW1lKSB7XG4gICAgY29uc3QgdGFnTmFtZSA9IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiB0YWdOYW1lID09IFwibWV0YVwiICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwibmFtZVwiKSA9PSBuYW1lO1xufVxuXG5jbGFzcyBQYWdlU25hcHNob3QgZXh0ZW5kcyBTbmFwc2hvdCB7XG4gICAgY29uc3RydWN0b3IoZWxlbWVudCwgaGVhZFNuYXBzaG90KSB7XG4gICAgICAgIHN1cGVyKGVsZW1lbnQpO1xuICAgICAgICB0aGlzLmhlYWRTbmFwc2hvdCA9IGhlYWRTbmFwc2hvdDtcbiAgICB9XG4gICAgc3RhdGljIGZyb21IVE1MU3RyaW5nKGh0bWwgPSBcIlwiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyb21Eb2N1bWVudChwYXJzZUhUTUxEb2N1bWVudChodG1sKSk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyb21Eb2N1bWVudChlbGVtZW50Lm93bmVyRG9jdW1lbnQpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbURvY3VtZW50KHsgaGVhZCwgYm9keSB9KSB7XG4gICAgICAgIHJldHVybiBuZXcgdGhpcyhib2R5LCBuZXcgSGVhZFNuYXBzaG90KGhlYWQpKTtcbiAgICB9XG4gICAgY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGFnZVNuYXBzaG90KHRoaXMuZWxlbWVudC5jbG9uZU5vZGUodHJ1ZSksIHRoaXMuaGVhZFNuYXBzaG90KTtcbiAgICB9XG4gICAgZ2V0IGhlYWRFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWFkU25hcHNob3QuZWxlbWVudDtcbiAgICB9XG4gICAgZ2V0IHJvb3RMb2NhdGlvbigpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCByb290ID0gKF9hID0gdGhpcy5nZXRTZXR0aW5nKFwicm9vdFwiKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogXCIvXCI7XG4gICAgICAgIHJldHVybiBleHBhbmRVUkwocm9vdCk7XG4gICAgfVxuICAgIGdldCBjYWNoZUNvbnRyb2xWYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2V0dGluZyhcImNhY2hlLWNvbnRyb2xcIik7XG4gICAgfVxuICAgIGdldCBpc1ByZXZpZXdhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZUNvbnRyb2xWYWx1ZSAhPSBcIm5vLXByZXZpZXdcIjtcbiAgICB9XG4gICAgZ2V0IGlzQ2FjaGVhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZUNvbnRyb2xWYWx1ZSAhPSBcIm5vLWNhY2hlXCI7XG4gICAgfVxuICAgIGdldCBpc1Zpc2l0YWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2V0dGluZyhcInZpc2l0LWNvbnRyb2xcIikgIT0gXCJyZWxvYWRcIjtcbiAgICB9XG4gICAgZ2V0U2V0dGluZyhuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlYWRTbmFwc2hvdC5nZXRNZXRhVmFsdWUoYHR1cmJvLSR7bmFtZX1gKTtcbiAgICB9XG59XG5cbnZhciBUaW1pbmdNZXRyaWM7XG4oZnVuY3Rpb24gKFRpbWluZ01ldHJpYykge1xuICAgIFRpbWluZ01ldHJpY1tcInZpc2l0U3RhcnRcIl0gPSBcInZpc2l0U3RhcnRcIjtcbiAgICBUaW1pbmdNZXRyaWNbXCJyZXF1ZXN0U3RhcnRcIl0gPSBcInJlcXVlc3RTdGFydFwiO1xuICAgIFRpbWluZ01ldHJpY1tcInJlcXVlc3RFbmRcIl0gPSBcInJlcXVlc3RFbmRcIjtcbiAgICBUaW1pbmdNZXRyaWNbXCJ2aXNpdEVuZFwiXSA9IFwidmlzaXRFbmRcIjtcbn0pKFRpbWluZ01ldHJpYyB8fCAoVGltaW5nTWV0cmljID0ge30pKTtcbnZhciBWaXNpdFN0YXRlO1xuKGZ1bmN0aW9uIChWaXNpdFN0YXRlKSB7XG4gICAgVmlzaXRTdGF0ZVtcImluaXRpYWxpemVkXCJdID0gXCJpbml0aWFsaXplZFwiO1xuICAgIFZpc2l0U3RhdGVbXCJzdGFydGVkXCJdID0gXCJzdGFydGVkXCI7XG4gICAgVmlzaXRTdGF0ZVtcImNhbmNlbGVkXCJdID0gXCJjYW5jZWxlZFwiO1xuICAgIFZpc2l0U3RhdGVbXCJmYWlsZWRcIl0gPSBcImZhaWxlZFwiO1xuICAgIFZpc2l0U3RhdGVbXCJjb21wbGV0ZWRcIl0gPSBcImNvbXBsZXRlZFwiO1xufSkoVmlzaXRTdGF0ZSB8fCAoVmlzaXRTdGF0ZSA9IHt9KSk7XG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBhY3Rpb246IFwiYWR2YW5jZVwiLFxuICAgIGhpc3RvcnlDaGFuZ2VkOiBmYWxzZVxufTtcbnZhciBTeXN0ZW1TdGF0dXNDb2RlO1xuKGZ1bmN0aW9uIChTeXN0ZW1TdGF0dXNDb2RlKSB7XG4gICAgU3lzdGVtU3RhdHVzQ29kZVtTeXN0ZW1TdGF0dXNDb2RlW1wibmV0d29ya0ZhaWx1cmVcIl0gPSAwXSA9IFwibmV0d29ya0ZhaWx1cmVcIjtcbiAgICBTeXN0ZW1TdGF0dXNDb2RlW1N5c3RlbVN0YXR1c0NvZGVbXCJ0aW1lb3V0RmFpbHVyZVwiXSA9IC0xXSA9IFwidGltZW91dEZhaWx1cmVcIjtcbiAgICBTeXN0ZW1TdGF0dXNDb2RlW1N5c3RlbVN0YXR1c0NvZGVbXCJjb250ZW50VHlwZU1pc21hdGNoXCJdID0gLTJdID0gXCJjb250ZW50VHlwZU1pc21hdGNoXCI7XG59KShTeXN0ZW1TdGF0dXNDb2RlIHx8IChTeXN0ZW1TdGF0dXNDb2RlID0ge30pKTtcbmNsYXNzIFZpc2l0IHtcbiAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSwgbG9jYXRpb24sIHJlc3RvcmF0aW9uSWRlbnRpZmllciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuaWRlbnRpZmllciA9IHV1aWQoKTtcbiAgICAgICAgdGhpcy50aW1pbmdNZXRyaWNzID0ge307XG4gICAgICAgIHRoaXMuZm9sbG93ZWRSZWRpcmVjdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmhpc3RvcnlDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2Nyb2xsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zbmFwc2hvdENhY2hlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN0YXRlID0gVmlzaXRTdGF0ZS5pbml0aWFsaXplZDtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlO1xuICAgICAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247XG4gICAgICAgIHRoaXMucmVzdG9yYXRpb25JZGVudGlmaWVyID0gcmVzdG9yYXRpb25JZGVudGlmaWVyIHx8IHV1aWQoKTtcbiAgICAgICAgY29uc3QgeyBhY3Rpb24sIGhpc3RvcnlDaGFuZ2VkLCByZWZlcnJlciwgc25hcHNob3RIVE1MLCByZXNwb25zZSB9ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0T3B0aW9ucyksIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjtcbiAgICAgICAgdGhpcy5oaXN0b3J5Q2hhbmdlZCA9IGhpc3RvcnlDaGFuZ2VkO1xuICAgICAgICB0aGlzLnJlZmVycmVyID0gcmVmZXJyZXI7XG4gICAgICAgIHRoaXMuc25hcHNob3RIVE1MID0gc25hcHNob3RIVE1MO1xuICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuaXNTYW1lUGFnZSA9IHRoaXMuZGVsZWdhdGUubG9jYXRpb25XaXRoQWN0aW9uSXNTYW1lUGFnZSh0aGlzLmxvY2F0aW9uLCB0aGlzLmFjdGlvbik7XG4gICAgfVxuICAgIGdldCBhZGFwdGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5hZGFwdGVyO1xuICAgIH1cbiAgICBnZXQgdmlldygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUudmlldztcbiAgICB9XG4gICAgZ2V0IGhpc3RvcnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmhpc3Rvcnk7XG4gICAgfVxuICAgIGdldCByZXN0b3JhdGlvbkRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhpc3RvcnkuZ2V0UmVzdG9yYXRpb25EYXRhRm9ySWRlbnRpZmllcih0aGlzLnJlc3RvcmF0aW9uSWRlbnRpZmllcik7XG4gICAgfVxuICAgIGdldCBzaWxlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2FtZVBhZ2U7XG4gICAgfVxuICAgIHN0YXJ0KCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PSBWaXNpdFN0YXRlLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICB0aGlzLnJlY29yZFRpbWluZ01ldHJpYyhUaW1pbmdNZXRyaWMudmlzaXRTdGFydCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gVmlzaXRTdGF0ZS5zdGFydGVkO1xuICAgICAgICAgICAgdGhpcy5hZGFwdGVyLnZpc2l0U3RhcnRlZCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUudmlzaXRTdGFydGVkKHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT0gVmlzaXRTdGF0ZS5zdGFydGVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0LmNhbmNlbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jYW5jZWxSZW5kZXIoKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBWaXNpdFN0YXRlLmNhbmNlbGVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbXBsZXRlKCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PSBWaXNpdFN0YXRlLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVjb3JkVGltaW5nTWV0cmljKFRpbWluZ01ldHJpYy52aXNpdEVuZCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gVmlzaXRTdGF0ZS5jb21wbGV0ZWQ7XG4gICAgICAgICAgICB0aGlzLmFkYXB0ZXIudmlzaXRDb21wbGV0ZWQodGhpcyk7XG4gICAgICAgICAgICB0aGlzLmRlbGVnYXRlLnZpc2l0Q29tcGxldGVkKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5mb2xsb3dSZWRpcmVjdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZhaWwoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09IFZpc2l0U3RhdGUuc3RhcnRlZCkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFZpc2l0U3RhdGUuZmFpbGVkO1xuICAgICAgICAgICAgdGhpcy5hZGFwdGVyLnZpc2l0RmFpbGVkKHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNoYW5nZUhpc3RvcnkoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCF0aGlzLmhpc3RvcnlDaGFuZ2VkKSB7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb25Gb3JIaXN0b3J5ID0gdGhpcy5sb2NhdGlvbi5ocmVmID09PSAoKF9hID0gdGhpcy5yZWZlcnJlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhyZWYpID8gXCJyZXBsYWNlXCIgOiB0aGlzLmFjdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IHRoaXMuZ2V0SGlzdG9yeU1ldGhvZEZvckFjdGlvbihhY3Rpb25Gb3JIaXN0b3J5KTtcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeS51cGRhdGUobWV0aG9kLCB0aGlzLmxvY2F0aW9uLCB0aGlzLnJlc3RvcmF0aW9uSWRlbnRpZmllcik7XG4gICAgICAgICAgICB0aGlzLmhpc3RvcnlDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpc3N1ZVJlcXVlc3QoKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc1ByZWxvYWRlZFJlc3BvbnNlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2ltdWxhdGVSZXF1ZXN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5zaG91bGRJc3N1ZVJlcXVlc3QoKSAmJiAhdGhpcy5yZXF1ZXN0KSB7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3QgPSBuZXcgRmV0Y2hSZXF1ZXN0KHRoaXMsIEZldGNoTWV0aG9kLmdldCwgdGhpcy5sb2NhdGlvbik7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3QucGVyZm9ybSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNpbXVsYXRlUmVxdWVzdCgpIHtcbiAgICAgICAgaWYgKHRoaXMucmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRSZXF1ZXN0KCk7XG4gICAgICAgICAgICB0aGlzLnJlY29yZFJlc3BvbnNlKCk7XG4gICAgICAgICAgICB0aGlzLmZpbmlzaFJlcXVlc3QoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGFydFJlcXVlc3QoKSB7XG4gICAgICAgIHRoaXMucmVjb3JkVGltaW5nTWV0cmljKFRpbWluZ01ldHJpYy5yZXF1ZXN0U3RhcnQpO1xuICAgICAgICB0aGlzLmFkYXB0ZXIudmlzaXRSZXF1ZXN0U3RhcnRlZCh0aGlzKTtcbiAgICB9XG4gICAgcmVjb3JkUmVzcG9uc2UocmVzcG9uc2UgPSB0aGlzLnJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBjb25zdCB7IHN0YXR1c0NvZGUgfSA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgaWYgKGlzU3VjY2Vzc2Z1bChzdGF0dXNDb2RlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRhcHRlci52aXNpdFJlcXVlc3RDb21wbGV0ZWQodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkYXB0ZXIudmlzaXRSZXF1ZXN0RmFpbGVkV2l0aFN0YXR1c0NvZGUodGhpcywgc3RhdHVzQ29kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmluaXNoUmVxdWVzdCgpIHtcbiAgICAgICAgdGhpcy5yZWNvcmRUaW1pbmdNZXRyaWMoVGltaW5nTWV0cmljLnJlcXVlc3RFbmQpO1xuICAgICAgICB0aGlzLmFkYXB0ZXIudmlzaXRSZXF1ZXN0RmluaXNoZWQodGhpcyk7XG4gICAgfVxuICAgIGxvYWRSZXNwb25zZSgpIHtcbiAgICAgICAgaWYgKHRoaXMucmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgc3RhdHVzQ29kZSwgcmVzcG9uc2VIVE1MIH0gPSB0aGlzLnJlc3BvbnNlO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXIoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVTbmFwc2hvdCgpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXcucmVuZGVyUHJvbWlzZSlcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy52aWV3LnJlbmRlclByb21pc2U7XG4gICAgICAgICAgICAgICAgaWYgKGlzU3VjY2Vzc2Z1bChzdGF0dXNDb2RlKSAmJiByZXNwb25zZUhUTUwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnZpZXcucmVuZGVyUGFnZShQYWdlU25hcHNob3QuZnJvbUhUTUxTdHJpbmcocmVzcG9uc2VIVE1MKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRhcHRlci52aXNpdFJlbmRlcmVkKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnZpZXcucmVuZGVyRXJyb3IoUGFnZVNuYXBzaG90LmZyb21IVE1MU3RyaW5nKHJlc3BvbnNlSFRNTCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkYXB0ZXIudmlzaXRSZW5kZXJlZCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mYWlsKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0Q2FjaGVkU25hcHNob3QoKSB7XG4gICAgICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy52aWV3LmdldENhY2hlZFNuYXBzaG90Rm9yTG9jYXRpb24odGhpcy5sb2NhdGlvbikgfHwgdGhpcy5nZXRQcmVsb2FkZWRTbmFwc2hvdCgpO1xuICAgICAgICBpZiAoc25hcHNob3QgJiYgKCFnZXRBbmNob3IodGhpcy5sb2NhdGlvbikgfHwgc25hcHNob3QuaGFzQW5jaG9yKGdldEFuY2hvcih0aGlzLmxvY2F0aW9uKSkpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hY3Rpb24gPT0gXCJyZXN0b3JlXCIgfHwgc25hcHNob3QuaXNQcmV2aWV3YWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzbmFwc2hvdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRQcmVsb2FkZWRTbmFwc2hvdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc25hcHNob3RIVE1MKSB7XG4gICAgICAgICAgICByZXR1cm4gUGFnZVNuYXBzaG90LmZyb21IVE1MU3RyaW5nKHRoaXMuc25hcHNob3RIVE1MKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYXNDYWNoZWRTbmFwc2hvdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2FjaGVkU25hcHNob3QoKSAhPSBudWxsO1xuICAgIH1cbiAgICBsb2FkQ2FjaGVkU25hcHNob3QoKSB7XG4gICAgICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy5nZXRDYWNoZWRTbmFwc2hvdCgpO1xuICAgICAgICBpZiAoc25hcHNob3QpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzUHJldmlldyA9IHRoaXMuc2hvdWxkSXNzdWVSZXF1ZXN0KCk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZVNuYXBzaG90KCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNTYW1lUGFnZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkYXB0ZXIudmlzaXRSZW5kZXJlZCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXcucmVuZGVyUHJvbWlzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudmlldy5yZW5kZXJQcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnZpZXcucmVuZGVyUGFnZShzbmFwc2hvdCwgaXNQcmV2aWV3KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGFwdGVyLnZpc2l0UmVuZGVyZWQodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNQcmV2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb2xsb3dSZWRpcmVjdCgpIHtcbiAgICAgICAgaWYgKHRoaXMucmVkaXJlY3RlZFRvTG9jYXRpb24gJiYgIXRoaXMuZm9sbG93ZWRSZWRpcmVjdCkge1xuICAgICAgICAgICAgdGhpcy5hZGFwdGVyLnZpc2l0UHJvcG9zZWRUb0xvY2F0aW9uKHRoaXMucmVkaXJlY3RlZFRvTG9jYXRpb24sIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdyZXBsYWNlJyxcbiAgICAgICAgICAgICAgICByZXNwb25zZTogdGhpcy5yZXNwb25zZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmZvbGxvd2VkUmVkaXJlY3QgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdvVG9TYW1lUGFnZUFuY2hvcigpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTYW1lUGFnZSkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXIoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVTbmFwc2hvdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRhcHRlci52aXNpdFJlbmRlcmVkKHRoaXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVxdWVzdFN0YXJ0ZWQoKSB7XG4gICAgICAgIHRoaXMuc3RhcnRSZXF1ZXN0KCk7XG4gICAgfVxuICAgIHJlcXVlc3RQcmV2ZW50ZWRIYW5kbGluZ1Jlc3BvbnNlKHJlcXVlc3QsIHJlc3BvbnNlKSB7XG4gICAgfVxuICAgIGFzeW5jIHJlcXVlc3RTdWNjZWVkZWRXaXRoUmVzcG9uc2UocmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VIVE1MID0gYXdhaXQgcmVzcG9uc2UucmVzcG9uc2VIVE1MO1xuICAgICAgICBpZiAocmVzcG9uc2VIVE1MID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5yZWNvcmRSZXNwb25zZSh7IHN0YXR1c0NvZGU6IFN5c3RlbVN0YXR1c0NvZGUuY29udGVudFR5cGVNaXNtYXRjaCB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RlZFRvTG9jYXRpb24gPSByZXNwb25zZS5yZWRpcmVjdGVkID8gcmVzcG9uc2UubG9jYXRpb24gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLnJlY29yZFJlc3BvbnNlKHsgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzQ29kZSwgcmVzcG9uc2VIVE1MIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHJlcXVlc3RGYWlsZWRXaXRoUmVzcG9uc2UocmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VIVE1MID0gYXdhaXQgcmVzcG9uc2UucmVzcG9uc2VIVE1MO1xuICAgICAgICBpZiAocmVzcG9uc2VIVE1MID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5yZWNvcmRSZXNwb25zZSh7IHN0YXR1c0NvZGU6IFN5c3RlbVN0YXR1c0NvZGUuY29udGVudFR5cGVNaXNtYXRjaCB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVjb3JkUmVzcG9uc2UoeyBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXNDb2RlLCByZXNwb25zZUhUTUwgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVxdWVzdEVycm9yZWQocmVxdWVzdCwgZXJyb3IpIHtcbiAgICAgICAgdGhpcy5yZWNvcmRSZXNwb25zZSh7IHN0YXR1c0NvZGU6IFN5c3RlbVN0YXR1c0NvZGUubmV0d29ya0ZhaWx1cmUgfSk7XG4gICAgfVxuICAgIHJlcXVlc3RGaW5pc2hlZCgpIHtcbiAgICAgICAgdGhpcy5maW5pc2hSZXF1ZXN0KCk7XG4gICAgfVxuICAgIHBlcmZvcm1TY3JvbGwoKSB7XG4gICAgICAgIGlmICghdGhpcy5zY3JvbGxlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aW9uID09IFwicmVzdG9yZVwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1Jlc3RvcmVkUG9zaXRpb24oKSB8fCB0aGlzLnNjcm9sbFRvQW5jaG9yKCkgfHwgdGhpcy52aWV3LnNjcm9sbFRvVG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvQW5jaG9yKCkgfHwgdGhpcy52aWV3LnNjcm9sbFRvVG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5pc1NhbWVQYWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS52aXNpdFNjcm9sbGVkVG9TYW1lUGFnZUxvY2F0aW9uKHRoaXMudmlldy5sYXN0UmVuZGVyZWRMb2NhdGlvbiwgdGhpcy5sb2NhdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNjcm9sbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzY3JvbGxUb1Jlc3RvcmVkUG9zaXRpb24oKSB7XG4gICAgICAgIGNvbnN0IHsgc2Nyb2xsUG9zaXRpb24gfSA9IHRoaXMucmVzdG9yYXRpb25EYXRhO1xuICAgICAgICBpZiAoc2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5zY3JvbGxUb1Bvc2l0aW9uKHNjcm9sbFBvc2l0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNjcm9sbFRvQW5jaG9yKCkge1xuICAgICAgICBjb25zdCBhbmNob3IgPSBnZXRBbmNob3IodGhpcy5sb2NhdGlvbik7XG4gICAgICAgIGlmIChhbmNob3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy52aWV3LnNjcm9sbFRvQW5jaG9yKGFuY2hvcik7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZWNvcmRUaW1pbmdNZXRyaWMobWV0cmljKSB7XG4gICAgICAgIHRoaXMudGltaW5nTWV0cmljc1ttZXRyaWNdID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgfVxuICAgIGdldFRpbWluZ01ldHJpY3MoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnRpbWluZ01ldHJpY3MpO1xuICAgIH1cbiAgICBnZXRIaXN0b3J5TWV0aG9kRm9yQWN0aW9uKGFjdGlvbikge1xuICAgICAgICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgICAgICAgY2FzZSBcInJlcGxhY2VcIjogcmV0dXJuIGhpc3RvcnkucmVwbGFjZVN0YXRlO1xuICAgICAgICAgICAgY2FzZSBcImFkdmFuY2VcIjpcbiAgICAgICAgICAgIGNhc2UgXCJyZXN0b3JlXCI6IHJldHVybiBoaXN0b3J5LnB1c2hTdGF0ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYXNQcmVsb2FkZWRSZXNwb25zZSgpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLnJlc3BvbnNlID09IFwib2JqZWN0XCI7XG4gICAgfVxuICAgIHNob3VsZElzc3VlUmVxdWVzdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTYW1lUGFnZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuYWN0aW9uID09IFwicmVzdG9yZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gIXRoaXMuaGFzQ2FjaGVkU25hcHNob3QoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhY2hlU25hcHNob3QoKSB7XG4gICAgICAgIGlmICghdGhpcy5zbmFwc2hvdENhY2hlZCkge1xuICAgICAgICAgICAgdGhpcy52aWV3LmNhY2hlU25hcHNob3QoKTtcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3RDYWNoZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHJlbmRlcihjYWxsYmFjaykge1xuICAgICAgICB0aGlzLmNhbmNlbFJlbmRlcigpO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHRoaXMuZnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IGNhbGxiYWNrKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmZyYW1lO1xuICAgICAgICB0aGlzLnBlcmZvcm1TY3JvbGwoKTtcbiAgICB9XG4gICAgY2FuY2VsUmVuZGVyKCkge1xuICAgICAgICBpZiAodGhpcy5mcmFtZSkge1xuICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5mcmFtZSk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5mcmFtZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGlzU3VjY2Vzc2Z1bChzdGF0dXNDb2RlKSB7XG4gICAgcmV0dXJuIHN0YXR1c0NvZGUgPj0gMjAwICYmIHN0YXR1c0NvZGUgPCAzMDA7XG59XG5cbmNsYXNzIEJyb3dzZXJBZGFwdGVyIHtcbiAgICBjb25zdHJ1Y3RvcihzZXNzaW9uKSB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NCYXIgPSBuZXcgUHJvZ3Jlc3NCYXI7XG4gICAgICAgIHRoaXMuc2hvd1Byb2dyZXNzQmFyID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc0Jhci5zaG93KCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgfVxuICAgIHZpc2l0UHJvcG9zZWRUb0xvY2F0aW9uKGxvY2F0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMubmF2aWdhdG9yLnN0YXJ0VmlzaXQobG9jYXRpb24sIHV1aWQoKSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHZpc2l0U3RhcnRlZCh2aXNpdCkge1xuICAgICAgICB2aXNpdC5pc3N1ZVJlcXVlc3QoKTtcbiAgICAgICAgdmlzaXQuY2hhbmdlSGlzdG9yeSgpO1xuICAgICAgICB2aXNpdC5nb1RvU2FtZVBhZ2VBbmNob3IoKTtcbiAgICAgICAgdmlzaXQubG9hZENhY2hlZFNuYXBzaG90KCk7XG4gICAgfVxuICAgIHZpc2l0UmVxdWVzdFN0YXJ0ZWQodmlzaXQpIHtcbiAgICAgICAgdGhpcy5wcm9ncmVzc0Jhci5zZXRWYWx1ZSgwKTtcbiAgICAgICAgaWYgKHZpc2l0Lmhhc0NhY2hlZFNuYXBzaG90KCkgfHwgdmlzaXQuYWN0aW9uICE9IFwicmVzdG9yZVwiKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dWaXNpdFByb2dyZXNzQmFyQWZ0ZXJEZWxheSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaG93UHJvZ3Jlc3NCYXIoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdFJlcXVlc3RDb21wbGV0ZWQodmlzaXQpIHtcbiAgICAgICAgdmlzaXQubG9hZFJlc3BvbnNlKCk7XG4gICAgfVxuICAgIHZpc2l0UmVxdWVzdEZhaWxlZFdpdGhTdGF0dXNDb2RlKHZpc2l0LCBzdGF0dXNDb2RlKSB7XG4gICAgICAgIHN3aXRjaCAoc3RhdHVzQ29kZSkge1xuICAgICAgICAgICAgY2FzZSBTeXN0ZW1TdGF0dXNDb2RlLm5ldHdvcmtGYWlsdXJlOlxuICAgICAgICAgICAgY2FzZSBTeXN0ZW1TdGF0dXNDb2RlLnRpbWVvdXRGYWlsdXJlOlxuICAgICAgICAgICAgY2FzZSBTeXN0ZW1TdGF0dXNDb2RlLmNvbnRlbnRUeXBlTWlzbWF0Y2g6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVsb2FkKCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdC5sb2FkUmVzcG9uc2UoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdFJlcXVlc3RGaW5pc2hlZCh2aXNpdCkge1xuICAgICAgICB0aGlzLnByb2dyZXNzQmFyLnNldFZhbHVlKDEpO1xuICAgICAgICB0aGlzLmhpZGVWaXNpdFByb2dyZXNzQmFyKCk7XG4gICAgfVxuICAgIHZpc2l0Q29tcGxldGVkKHZpc2l0KSB7XG4gICAgfVxuICAgIHBhZ2VJbnZhbGlkYXRlZCgpIHtcbiAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICB9XG4gICAgdmlzaXRGYWlsZWQodmlzaXQpIHtcbiAgICB9XG4gICAgdmlzaXRSZW5kZXJlZCh2aXNpdCkge1xuICAgIH1cbiAgICBmb3JtU3VibWlzc2lvblN0YXJ0ZWQoZm9ybVN1Ym1pc3Npb24pIHtcbiAgICAgICAgdGhpcy5wcm9ncmVzc0Jhci5zZXRWYWx1ZSgwKTtcbiAgICAgICAgdGhpcy5zaG93Rm9ybVByb2dyZXNzQmFyQWZ0ZXJEZWxheSgpO1xuICAgIH1cbiAgICBmb3JtU3VibWlzc2lvbkZpbmlzaGVkKGZvcm1TdWJtaXNzaW9uKSB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NCYXIuc2V0VmFsdWUoMSk7XG4gICAgICAgIHRoaXMuaGlkZUZvcm1Qcm9ncmVzc0JhcigpO1xuICAgIH1cbiAgICBzaG93VmlzaXRQcm9ncmVzc0JhckFmdGVyRGVsYXkoKSB7XG4gICAgICAgIHRoaXMudmlzaXRQcm9ncmVzc0JhclRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNob3dQcm9ncmVzc0JhciwgdGhpcy5zZXNzaW9uLnByb2dyZXNzQmFyRGVsYXkpO1xuICAgIH1cbiAgICBoaWRlVmlzaXRQcm9ncmVzc0JhcigpIHtcbiAgICAgICAgdGhpcy5wcm9ncmVzc0Jhci5oaWRlKCk7XG4gICAgICAgIGlmICh0aGlzLnZpc2l0UHJvZ3Jlc3NCYXJUaW1lb3V0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52aXNpdFByb2dyZXNzQmFyVGltZW91dCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy52aXNpdFByb2dyZXNzQmFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzaG93Rm9ybVByb2dyZXNzQmFyQWZ0ZXJEZWxheSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZm9ybVByb2dyZXNzQmFyVGltZW91dCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1Qcm9ncmVzc0JhclRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNob3dQcm9ncmVzc0JhciwgdGhpcy5zZXNzaW9uLnByb2dyZXNzQmFyRGVsYXkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhpZGVGb3JtUHJvZ3Jlc3NCYXIoKSB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NCYXIuaGlkZSgpO1xuICAgICAgICBpZiAodGhpcy5mb3JtUHJvZ3Jlc3NCYXJUaW1lb3V0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5mb3JtUHJvZ3Jlc3NCYXJUaW1lb3V0KTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmZvcm1Qcm9ncmVzc0JhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVsb2FkKCkge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgfVxuICAgIGdldCBuYXZpZ2F0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24ubmF2aWdhdG9yO1xuICAgIH1cbn1cblxuY2xhc3MgQ2FjaGVPYnNlcnZlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBzdGFydCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRlZCA9IHRydWU7XG4gICAgICAgICAgICBhZGRFdmVudExpc3RlbmVyKFwidHVyYm86YmVmb3JlLWNhY2hlXCIsIHRoaXMucmVtb3ZlU3RhbGVFbGVtZW50cywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0b3AoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihcInR1cmJvOmJlZm9yZS1jYWNoZVwiLCB0aGlzLnJlbW92ZVN0YWxlRWxlbWVudHMsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW1vdmVTdGFsZUVsZW1lbnRzKCkge1xuICAgICAgICBjb25zdCBzdGFsZUVsZW1lbnRzID0gWy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXR1cmJvLWNhY2hlPVwiZmFsc2VcIl0nKV07XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBzdGFsZUVsZW1lbnRzKSB7XG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBGb3JtU3VibWl0T2JzZXJ2ZXIge1xuICAgIGNvbnN0cnVjdG9yKGRlbGVnYXRlKSB7XG4gICAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN1Ym1pdENhcHR1cmVkID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCB0aGlzLnN1Ym1pdEJ1YmJsZWQsIGZhbHNlKTtcbiAgICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgdGhpcy5zdWJtaXRCdWJibGVkLCBmYWxzZSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc3VibWl0QnViYmxlZCA9ICgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvcm0gPSBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQgPyBldmVudC50YXJnZXQgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3VibWl0dGVyID0gZXZlbnQuc3VibWl0dGVyIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoZm9ybSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXRob2QgPSAoc3VibWl0dGVyID09PSBudWxsIHx8IHN1Ym1pdHRlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3VibWl0dGVyLmdldEF0dHJpYnV0ZShcImZvcm1tZXRob2RcIikpIHx8IGZvcm0ubWV0aG9kO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9IFwiZGlhbG9nXCIgJiYgdGhpcy5kZWxlZ2F0ZS53aWxsU3VibWl0Rm9ybShmb3JtLCBzdWJtaXR0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5mb3JtU3VibWl0dGVkKGZvcm0sIHN1Ym1pdHRlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7XG4gICAgfVxuICAgIHN0YXJ0KCkge1xuICAgICAgICBpZiAoIXRoaXMuc3RhcnRlZCkge1xuICAgICAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCB0aGlzLnN1Ym1pdENhcHR1cmVkLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RvcCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhcnRlZCkge1xuICAgICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCB0aGlzLnN1Ym1pdENhcHR1cmVkLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBGcmFtZVJlZGlyZWN0b3Ige1xuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5saW5rSW50ZXJjZXB0b3IgPSBuZXcgTGlua0ludGVyY2VwdG9yKHRoaXMsIGVsZW1lbnQpO1xuICAgICAgICB0aGlzLmZvcm1JbnRlcmNlcHRvciA9IG5ldyBGb3JtSW50ZXJjZXB0b3IodGhpcywgZWxlbWVudCk7XG4gICAgfVxuICAgIHN0YXJ0KCkge1xuICAgICAgICB0aGlzLmxpbmtJbnRlcmNlcHRvci5zdGFydCgpO1xuICAgICAgICB0aGlzLmZvcm1JbnRlcmNlcHRvci5zdGFydCgpO1xuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICB0aGlzLmxpbmtJbnRlcmNlcHRvci5zdG9wKCk7XG4gICAgICAgIHRoaXMuZm9ybUludGVyY2VwdG9yLnN0b3AoKTtcbiAgICB9XG4gICAgc2hvdWxkSW50ZXJjZXB0TGlua0NsaWNrKGVsZW1lbnQsIHVybCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaG91bGRSZWRpcmVjdChlbGVtZW50KTtcbiAgICB9XG4gICAgbGlua0NsaWNrSW50ZXJjZXB0ZWQoZWxlbWVudCwgdXJsKSB7XG4gICAgICAgIGNvbnN0IGZyYW1lID0gdGhpcy5maW5kRnJhbWVFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICBpZiAoZnJhbWUpIHtcbiAgICAgICAgICAgIGZyYW1lLnNldEF0dHJpYnV0ZShcInJlbG9hZGFibGVcIiwgXCJcIik7XG4gICAgICAgICAgICBmcmFtZS5zcmMgPSB1cmw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2hvdWxkSW50ZXJjZXB0Rm9ybVN1Ym1pc3Npb24oZWxlbWVudCwgc3VibWl0dGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNob3VsZFJlZGlyZWN0KGVsZW1lbnQsIHN1Ym1pdHRlcik7XG4gICAgfVxuICAgIGZvcm1TdWJtaXNzaW9uSW50ZXJjZXB0ZWQoZWxlbWVudCwgc3VibWl0dGVyKSB7XG4gICAgICAgIGNvbnN0IGZyYW1lID0gdGhpcy5maW5kRnJhbWVFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICBpZiAoZnJhbWUpIHtcbiAgICAgICAgICAgIGZyYW1lLnJlbW92ZUF0dHJpYnV0ZShcInJlbG9hZGFibGVcIik7XG4gICAgICAgICAgICBmcmFtZS5kZWxlZ2F0ZS5mb3JtU3VibWlzc2lvbkludGVyY2VwdGVkKGVsZW1lbnQsIHN1Ym1pdHRlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2hvdWxkUmVkaXJlY3QoZWxlbWVudCwgc3VibWl0dGVyKSB7XG4gICAgICAgIGNvbnN0IGZyYW1lID0gdGhpcy5maW5kRnJhbWVFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gZnJhbWUgPyBmcmFtZSAhPSBlbGVtZW50LmNsb3Nlc3QoXCJ0dXJiby1mcmFtZVwiKSA6IGZhbHNlO1xuICAgIH1cbiAgICBmaW5kRnJhbWVFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtdHVyYm8tZnJhbWVcIik7XG4gICAgICAgIGlmIChpZCAmJiBpZCAhPSBcIl90b3BcIikge1xuICAgICAgICAgICAgY29uc3QgZnJhbWUgPSB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvcihgIyR7aWR9Om5vdChbZGlzYWJsZWRdKWApO1xuICAgICAgICAgICAgaWYgKGZyYW1lIGluc3RhbmNlb2YgRnJhbWVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZyYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBIaXN0b3J5IHtcbiAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSkge1xuICAgICAgICB0aGlzLnJlc3RvcmF0aW9uSWRlbnRpZmllciA9IHV1aWQoKTtcbiAgICAgICAgdGhpcy5yZXN0b3JhdGlvbkRhdGEgPSB7fTtcbiAgICAgICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGFnZUxvYWRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uUG9wU3RhdGUgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZEhhbmRsZVBvcFN0YXRlKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHR1cmJvIH0gPSBldmVudC5zdGF0ZSB8fCB7fTtcbiAgICAgICAgICAgICAgICBpZiAodHVyYm8pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhdGlvbiA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHJlc3RvcmF0aW9uSWRlbnRpZmllciB9ID0gdHVyYm87XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yYXRpb25JZGVudGlmaWVyID0gcmVzdG9yYXRpb25JZGVudGlmaWVyO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlbGVnYXRlLmhpc3RvcnlQb3BwZWRUb0xvY2F0aW9uV2l0aFJlc3RvcmF0aW9uSWRlbnRpZmllcih0aGlzLmxvY2F0aW9uLCByZXN0b3JhdGlvbklkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vblBhZ2VMb2FkID0gYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBuZXh0TWljcm90YXNrKCk7XG4gICAgICAgICAgICB0aGlzLnBhZ2VMb2FkZWQgPSB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7XG4gICAgfVxuICAgIHN0YXJ0KCkge1xuICAgICAgICBpZiAoIXRoaXMuc3RhcnRlZCkge1xuICAgICAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihcInBvcHN0YXRlXCIsIHRoaXMub25Qb3BTdGF0ZSwgZmFsc2UpO1xuICAgICAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgdGhpcy5vblBhZ2VMb2FkLCBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlKG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICBpZiAodGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgdGhpcy5vblBvcFN0YXRlLCBmYWxzZSk7XG4gICAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKFwibG9hZFwiLCB0aGlzLm9uUGFnZUxvYWQsIGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1c2gobG9jYXRpb24sIHJlc3RvcmF0aW9uSWRlbnRpZmllcikge1xuICAgICAgICB0aGlzLnVwZGF0ZShoaXN0b3J5LnB1c2hTdGF0ZSwgbG9jYXRpb24sIHJlc3RvcmF0aW9uSWRlbnRpZmllcik7XG4gICAgfVxuICAgIHJlcGxhY2UobG9jYXRpb24sIHJlc3RvcmF0aW9uSWRlbnRpZmllcikge1xuICAgICAgICB0aGlzLnVwZGF0ZShoaXN0b3J5LnJlcGxhY2VTdGF0ZSwgbG9jYXRpb24sIHJlc3RvcmF0aW9uSWRlbnRpZmllcik7XG4gICAgfVxuICAgIHVwZGF0ZShtZXRob2QsIGxvY2F0aW9uLCByZXN0b3JhdGlvbklkZW50aWZpZXIgPSB1dWlkKCkpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB7IHR1cmJvOiB7IHJlc3RvcmF0aW9uSWRlbnRpZmllciB9IH07XG4gICAgICAgIG1ldGhvZC5jYWxsKGhpc3RvcnksIHN0YXRlLCBcIlwiLCBsb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uO1xuICAgICAgICB0aGlzLnJlc3RvcmF0aW9uSWRlbnRpZmllciA9IHJlc3RvcmF0aW9uSWRlbnRpZmllcjtcbiAgICB9XG4gICAgZ2V0UmVzdG9yYXRpb25EYXRhRm9ySWRlbnRpZmllcihyZXN0b3JhdGlvbklkZW50aWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzdG9yYXRpb25EYXRhW3Jlc3RvcmF0aW9uSWRlbnRpZmllcl0gfHwge307XG4gICAgfVxuICAgIHVwZGF0ZVJlc3RvcmF0aW9uRGF0YShhZGRpdGlvbmFsRGF0YSkge1xuICAgICAgICBjb25zdCB7IHJlc3RvcmF0aW9uSWRlbnRpZmllciB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgcmVzdG9yYXRpb25EYXRhID0gdGhpcy5yZXN0b3JhdGlvbkRhdGFbcmVzdG9yYXRpb25JZGVudGlmaWVyXTtcbiAgICAgICAgdGhpcy5yZXN0b3JhdGlvbkRhdGFbcmVzdG9yYXRpb25JZGVudGlmaWVyXSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzdG9yYXRpb25EYXRhKSwgYWRkaXRpb25hbERhdGEpO1xuICAgIH1cbiAgICBhc3N1bWVDb250cm9sT2ZTY3JvbGxSZXN0b3JhdGlvbigpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIXRoaXMucHJldmlvdXNTY3JvbGxSZXN0b3JhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91c1Njcm9sbFJlc3RvcmF0aW9uID0gKF9hID0gaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogXCJhdXRvXCI7XG4gICAgICAgICAgICBoaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uID0gXCJtYW51YWxcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZWxpbnF1aXNoQ29udHJvbE9mU2Nyb2xsUmVzdG9yYXRpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLnByZXZpb3VzU2Nyb2xsUmVzdG9yYXRpb24pIHtcbiAgICAgICAgICAgIGhpc3Rvcnkuc2Nyb2xsUmVzdG9yYXRpb24gPSB0aGlzLnByZXZpb3VzU2Nyb2xsUmVzdG9yYXRpb247XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5wcmV2aW91c1Njcm9sbFJlc3RvcmF0aW9uO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNob3VsZEhhbmRsZVBvcFN0YXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdlSXNMb2FkZWQoKTtcbiAgICB9XG4gICAgcGFnZUlzTG9hZGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdlTG9hZGVkIHx8IGRvY3VtZW50LnJlYWR5U3RhdGUgPT0gXCJjb21wbGV0ZVwiO1xuICAgIH1cbn1cblxuY2xhc3MgTGlua0NsaWNrT2JzZXJ2ZXIge1xuICAgIGNvbnN0cnVjdG9yKGRlbGVnYXRlKSB7XG4gICAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNsaWNrQ2FwdHVyZWQgPSAoKSA9PiB7XG4gICAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5jbGlja0J1YmJsZWQsIGZhbHNlKTtcbiAgICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLmNsaWNrQnViYmxlZCwgZmFsc2UpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNsaWNrQnViYmxlZCA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2xpY2tFdmVudElzU2lnbmlmaWNhbnQoZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gKGV2ZW50LmNvbXBvc2VkUGF0aCAmJiBldmVudC5jb21wb3NlZFBhdGgoKVswXSkgfHwgZXZlbnQudGFyZ2V0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmsgPSB0aGlzLmZpbmRMaW5rRnJvbUNsaWNrVGFyZ2V0KHRhcmdldCk7XG4gICAgICAgICAgICAgICAgaWYgKGxpbmspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLmdldExvY2F0aW9uRm9yTGluayhsaW5rKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVsZWdhdGUud2lsbEZvbGxvd0xpbmtUb0xvY2F0aW9uKGxpbmssIGxvY2F0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUuZm9sbG93ZWRMaW5rVG9Mb2NhdGlvbihsaW5rLCBsb2NhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTtcbiAgICB9XG4gICAgc3RhcnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICBhZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5jbGlja0NhcHR1cmVkLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RvcCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhcnRlZCkge1xuICAgICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuY2xpY2tDYXB0dXJlZCwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjbGlja0V2ZW50SXNTaWduaWZpY2FudChldmVudCkge1xuICAgICAgICByZXR1cm4gISgoZXZlbnQudGFyZ2V0ICYmIGV2ZW50LnRhcmdldC5pc0NvbnRlbnRFZGl0YWJsZSlcbiAgICAgICAgICAgIHx8IGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWRcbiAgICAgICAgICAgIHx8IGV2ZW50LndoaWNoID4gMVxuICAgICAgICAgICAgfHwgZXZlbnQuYWx0S2V5XG4gICAgICAgICAgICB8fCBldmVudC5jdHJsS2V5XG4gICAgICAgICAgICB8fCBldmVudC5tZXRhS2V5XG4gICAgICAgICAgICB8fCBldmVudC5zaGlmdEtleSk7XG4gICAgfVxuICAgIGZpbmRMaW5rRnJvbUNsaWNrVGFyZ2V0KHRhcmdldCkge1xuICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5jbG9zZXN0KFwiYVtocmVmXTpub3QoW3RhcmdldF49X10pOm5vdChbZG93bmxvYWRdKVwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRMb2NhdGlvbkZvckxpbmsobGluaykge1xuICAgICAgICByZXR1cm4gZXhwYW5kVVJMKGxpbmsuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSB8fCBcIlwiKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzQWN0aW9uKGFjdGlvbikge1xuICAgIHJldHVybiBhY3Rpb24gPT0gXCJhZHZhbmNlXCIgfHwgYWN0aW9uID09IFwicmVwbGFjZVwiIHx8IGFjdGlvbiA9PSBcInJlc3RvcmVcIjtcbn1cblxuY2xhc3MgTmF2aWdhdG9yIHtcbiAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSkge1xuICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7XG4gICAgfVxuICAgIHByb3Bvc2VWaXNpdChsb2NhdGlvbiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICh0aGlzLmRlbGVnYXRlLmFsbG93c1Zpc2l0aW5nTG9jYXRpb25XaXRoQWN0aW9uKGxvY2F0aW9uLCBvcHRpb25zLmFjdGlvbikpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUudmlzaXRQcm9wb3NlZFRvTG9jYXRpb24obG9jYXRpb24sIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXJ0VmlzaXQobG9jYXRhYmxlLCByZXN0b3JhdGlvbklkZW50aWZpZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgdGhpcy5jdXJyZW50VmlzaXQgPSBuZXcgVmlzaXQodGhpcywgZXhwYW5kVVJMKGxvY2F0YWJsZSksIHJlc3RvcmF0aW9uSWRlbnRpZmllciwgT2JqZWN0LmFzc2lnbih7IHJlZmVycmVyOiB0aGlzLmxvY2F0aW9uIH0sIG9wdGlvbnMpKTtcbiAgICAgICAgdGhpcy5jdXJyZW50VmlzaXQuc3RhcnQoKTtcbiAgICB9XG4gICAgc3VibWl0Rm9ybShmb3JtLCBzdWJtaXR0ZXIpIHtcbiAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgIHRoaXMuZm9ybVN1Ym1pc3Npb24gPSBuZXcgRm9ybVN1Ym1pc3Npb24odGhpcywgZm9ybSwgc3VibWl0dGVyLCB0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMuZm9ybVN1Ym1pc3Npb24uaXNJZGVtcG90ZW50KSB7XG4gICAgICAgICAgICB0aGlzLnByb3Bvc2VWaXNpdCh0aGlzLmZvcm1TdWJtaXNzaW9uLmZldGNoUmVxdWVzdC51cmwsIHsgYWN0aW9uOiB0aGlzLmdldEFjdGlvbkZvckZvcm1TdWJtaXNzaW9uKHRoaXMuZm9ybVN1Ym1pc3Npb24pIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mb3JtU3VibWlzc2lvbi5zdGFydCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0b3AoKSB7XG4gICAgICAgIGlmICh0aGlzLmZvcm1TdWJtaXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1TdWJtaXNzaW9uLnN0b3AoKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmZvcm1TdWJtaXNzaW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRWaXNpdCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VmlzaXQuY2FuY2VsKCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jdXJyZW50VmlzaXQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGFkYXB0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmFkYXB0ZXI7XG4gICAgfVxuICAgIGdldCB2aWV3KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS52aWV3O1xuICAgIH1cbiAgICBnZXQgaGlzdG9yeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUuaGlzdG9yeTtcbiAgICB9XG4gICAgZm9ybVN1Ym1pc3Npb25TdGFydGVkKGZvcm1TdWJtaXNzaW9uKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hZGFwdGVyLmZvcm1TdWJtaXNzaW9uU3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5hZGFwdGVyLmZvcm1TdWJtaXNzaW9uU3RhcnRlZChmb3JtU3VibWlzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZm9ybVN1Ym1pc3Npb25TdWNjZWVkZWRXaXRoUmVzcG9uc2UoZm9ybVN1Ym1pc3Npb24sIGZldGNoUmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKGZvcm1TdWJtaXNzaW9uID09IHRoaXMuZm9ybVN1Ym1pc3Npb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSFRNTCA9IGF3YWl0IGZldGNoUmVzcG9uc2UucmVzcG9uc2VIVE1MO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlSFRNTCkge1xuICAgICAgICAgICAgICAgIGlmIChmb3JtU3VibWlzc2lvbi5tZXRob2QgIT0gRmV0Y2hNZXRob2QuZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlldy5jbGVhclNuYXBzaG90Q2FjaGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgeyBzdGF0dXNDb2RlIH0gPSBmZXRjaFJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZpc2l0T3B0aW9ucyA9IHsgcmVzcG9uc2U6IHsgc3RhdHVzQ29kZSwgcmVzcG9uc2VIVE1MIH0gfTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3Bvc2VWaXNpdChmZXRjaFJlc3BvbnNlLmxvY2F0aW9uLCB2aXNpdE9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGZvcm1TdWJtaXNzaW9uRmFpbGVkV2l0aFJlc3BvbnNlKGZvcm1TdWJtaXNzaW9uLCBmZXRjaFJlc3BvbnNlKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlSFRNTCA9IGF3YWl0IGZldGNoUmVzcG9uc2UucmVzcG9uc2VIVE1MO1xuICAgICAgICBpZiAocmVzcG9uc2VIVE1MKSB7XG4gICAgICAgICAgICBjb25zdCBzbmFwc2hvdCA9IFBhZ2VTbmFwc2hvdC5mcm9tSFRNTFN0cmluZyhyZXNwb25zZUhUTUwpO1xuICAgICAgICAgICAgaWYgKGZldGNoUmVzcG9uc2Uuc2VydmVyRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnZpZXcucmVuZGVyRXJyb3Ioc25hcHNob3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy52aWV3LnJlbmRlclBhZ2Uoc25hcHNob3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy52aWV3LnNjcm9sbFRvVG9wKCk7XG4gICAgICAgICAgICB0aGlzLnZpZXcuY2xlYXJTbmFwc2hvdENhY2hlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9ybVN1Ym1pc3Npb25FcnJvcmVkKGZvcm1TdWJtaXNzaW9uLCBlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9XG4gICAgZm9ybVN1Ym1pc3Npb25GaW5pc2hlZChmb3JtU3VibWlzc2lvbikge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYWRhcHRlci5mb3JtU3VibWlzc2lvbkZpbmlzaGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLmFkYXB0ZXIuZm9ybVN1Ym1pc3Npb25GaW5pc2hlZChmb3JtU3VibWlzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRTdGFydGVkKHZpc2l0KSB7XG4gICAgICAgIHRoaXMuZGVsZWdhdGUudmlzaXRTdGFydGVkKHZpc2l0KTtcbiAgICB9XG4gICAgdmlzaXRDb21wbGV0ZWQodmlzaXQpIHtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZS52aXNpdENvbXBsZXRlZCh2aXNpdCk7XG4gICAgfVxuICAgIGxvY2F0aW9uV2l0aEFjdGlvbklzU2FtZVBhZ2UobG9jYXRpb24sIGFjdGlvbikge1xuICAgICAgICBjb25zdCBhbmNob3IgPSBnZXRBbmNob3IobG9jYXRpb24pO1xuICAgICAgICBjb25zdCBjdXJyZW50QW5jaG9yID0gZ2V0QW5jaG9yKHRoaXMudmlldy5sYXN0UmVuZGVyZWRMb2NhdGlvbik7XG4gICAgICAgIGNvbnN0IGlzUmVzdG9yYXRpb25Ub1RvcCA9IGFjdGlvbiA9PT0gJ3Jlc3RvcmUnICYmIHR5cGVvZiBhbmNob3IgPT09ICd1bmRlZmluZWQnO1xuICAgICAgICByZXR1cm4gYWN0aW9uICE9PSBcInJlcGxhY2VcIiAmJlxuICAgICAgICAgICAgZ2V0UmVxdWVzdFVSTChsb2NhdGlvbikgPT09IGdldFJlcXVlc3RVUkwodGhpcy52aWV3Lmxhc3RSZW5kZXJlZExvY2F0aW9uKSAmJlxuICAgICAgICAgICAgKGlzUmVzdG9yYXRpb25Ub1RvcCB8fCAoYW5jaG9yICE9IG51bGwgJiYgYW5jaG9yICE9PSBjdXJyZW50QW5jaG9yKSk7XG4gICAgfVxuICAgIHZpc2l0U2Nyb2xsZWRUb1NhbWVQYWdlTG9jYXRpb24ob2xkVVJMLCBuZXdVUkwpIHtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZS52aXNpdFNjcm9sbGVkVG9TYW1lUGFnZUxvY2F0aW9uKG9sZFVSTCwgbmV3VVJMKTtcbiAgICB9XG4gICAgZ2V0IGxvY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oaXN0b3J5LmxvY2F0aW9uO1xuICAgIH1cbiAgICBnZXQgcmVzdG9yYXRpb25JZGVudGlmaWVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oaXN0b3J5LnJlc3RvcmF0aW9uSWRlbnRpZmllcjtcbiAgICB9XG4gICAgZ2V0QWN0aW9uRm9yRm9ybVN1Ym1pc3Npb24oZm9ybVN1Ym1pc3Npb24pIHtcbiAgICAgICAgY29uc3QgeyBmb3JtRWxlbWVudCwgc3VibWl0dGVyIH0gPSBmb3JtU3VibWlzc2lvbjtcbiAgICAgICAgY29uc3QgYWN0aW9uID0gKHN1Ym1pdHRlciA9PT0gbnVsbCB8fCBzdWJtaXR0ZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN1Ym1pdHRlci5nZXRBdHRyaWJ1dGUoXCJkYXRhLXR1cmJvLWFjdGlvblwiKSkgfHwgZm9ybUVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS10dXJiby1hY3Rpb25cIik7XG4gICAgICAgIHJldHVybiBpc0FjdGlvbihhY3Rpb24pID8gYWN0aW9uIDogXCJhZHZhbmNlXCI7XG4gICAgfVxufVxuXG52YXIgUGFnZVN0YWdlO1xuKGZ1bmN0aW9uIChQYWdlU3RhZ2UpIHtcbiAgICBQYWdlU3RhZ2VbUGFnZVN0YWdlW1wiaW5pdGlhbFwiXSA9IDBdID0gXCJpbml0aWFsXCI7XG4gICAgUGFnZVN0YWdlW1BhZ2VTdGFnZVtcImxvYWRpbmdcIl0gPSAxXSA9IFwibG9hZGluZ1wiO1xuICAgIFBhZ2VTdGFnZVtQYWdlU3RhZ2VbXCJpbnRlcmFjdGl2ZVwiXSA9IDJdID0gXCJpbnRlcmFjdGl2ZVwiO1xuICAgIFBhZ2VTdGFnZVtQYWdlU3RhZ2VbXCJjb21wbGV0ZVwiXSA9IDNdID0gXCJjb21wbGV0ZVwiO1xufSkoUGFnZVN0YWdlIHx8IChQYWdlU3RhZ2UgPSB7fSkpO1xuY2xhc3MgUGFnZU9ic2VydmVyIHtcbiAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSkge1xuICAgICAgICB0aGlzLnN0YWdlID0gUGFnZVN0YWdlLmluaXRpYWw7XG4gICAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmludGVycHJldFJlYWR5U3RhdGUgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHJlYWR5U3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgICBpZiAocmVhZHlTdGF0ZSA9PSBcImludGVyYWN0aXZlXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VJc0ludGVyYWN0aXZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZWFkeVN0YXRlID09IFwiY29tcGxldGVcIikge1xuICAgICAgICAgICAgICAgIHRoaXMucGFnZUlzQ29tcGxldGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wYWdlV2lsbFVubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUucGFnZVdpbGxVbmxvYWQoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlO1xuICAgIH1cbiAgICBzdGFydCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YWdlID09IFBhZ2VTdGFnZS5pbml0aWFsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFnZSA9IFBhZ2VTdGFnZS5sb2FkaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInJlYWR5c3RhdGVjaGFuZ2VcIiwgdGhpcy5pbnRlcnByZXRSZWFkeVN0YXRlLCBmYWxzZSk7XG4gICAgICAgICAgICBhZGRFdmVudExpc3RlbmVyKFwicGFnZWhpZGVcIiwgdGhpcy5wYWdlV2lsbFVubG9hZCwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5zdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICBpZiAodGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVhZHlzdGF0ZWNoYW5nZVwiLCB0aGlzLmludGVycHJldFJlYWR5U3RhdGUsIGZhbHNlKTtcbiAgICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLCB0aGlzLnBhZ2VXaWxsVW5sb2FkLCBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwYWdlSXNJbnRlcmFjdGl2ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhZ2UgPT0gUGFnZVN0YWdlLmxvYWRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhZ2UgPSBQYWdlU3RhZ2UuaW50ZXJhY3RpdmU7XG4gICAgICAgICAgICB0aGlzLmRlbGVnYXRlLnBhZ2VCZWNhbWVJbnRlcmFjdGl2ZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHBhZ2VJc0NvbXBsZXRlKCkge1xuICAgICAgICB0aGlzLnBhZ2VJc0ludGVyYWN0aXZlKCk7XG4gICAgICAgIGlmICh0aGlzLnN0YWdlID09IFBhZ2VTdGFnZS5pbnRlcmFjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5zdGFnZSA9IFBhZ2VTdGFnZS5jb21wbGV0ZTtcbiAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUucGFnZUxvYWRlZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCByZWFkeVN0YXRlKCkge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQucmVhZHlTdGF0ZTtcbiAgICB9XG59XG5cbmNsYXNzIFNjcm9sbE9ic2VydmVyIHtcbiAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSkge1xuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vblNjcm9sbCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24oeyB4OiB3aW5kb3cucGFnZVhPZmZzZXQsIHk6IHdpbmRvdy5wYWdlWU9mZnNldCB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlO1xuICAgIH1cbiAgICBzdGFydCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5vblNjcm9sbCgpO1xuICAgICAgICAgICAgdGhpcy5zdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICBpZiAodGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwsIGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZVBvc2l0aW9uKHBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMuZGVsZWdhdGUuc2Nyb2xsUG9zaXRpb25DaGFuZ2VkKHBvc2l0aW9uKTtcbiAgICB9XG59XG5cbmNsYXNzIFN0cmVhbU9ic2VydmVyIHtcbiAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSkge1xuICAgICAgICB0aGlzLnNvdXJjZXMgPSBuZXcgU2V0O1xuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbnNwZWN0RmV0Y2hSZXNwb25zZSA9ICgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZmV0Y2hSZXNwb25zZUZyb21FdmVudChldmVudCk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgZmV0Y2hSZXNwb25zZUlzU3RyZWFtKHJlc3BvbnNlKSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWNlaXZlTWVzc2FnZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVjZWl2ZU1lc3NhZ2VFdmVudCA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RhcnRlZCAmJiB0eXBlb2YgZXZlbnQuZGF0YSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWNlaXZlTWVzc2FnZUhUTUwoZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTtcbiAgICB9XG4gICAgc3RhcnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihcInR1cmJvOmJlZm9yZS1mZXRjaC1yZXNwb25zZVwiLCB0aGlzLmluc3BlY3RGZXRjaFJlc3BvbnNlLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RvcCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhcnRlZCkge1xuICAgICAgICAgICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG4gICAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKFwidHVyYm86YmVmb3JlLWZldGNoLXJlc3BvbnNlXCIsIHRoaXMuaW5zcGVjdEZldGNoUmVzcG9uc2UsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25uZWN0U3RyZWFtU291cmNlKHNvdXJjZSkge1xuICAgICAgICBpZiAoIXRoaXMuc3RyZWFtU291cmNlSXNDb25uZWN0ZWQoc291cmNlKSkge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VzLmFkZChzb3VyY2UpO1xuICAgICAgICAgICAgc291cmNlLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMucmVjZWl2ZU1lc3NhZ2VFdmVudCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc2Nvbm5lY3RTdHJlYW1Tb3VyY2Uoc291cmNlKSB7XG4gICAgICAgIGlmICh0aGlzLnN0cmVhbVNvdXJjZUlzQ29ubmVjdGVkKHNvdXJjZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlcy5kZWxldGUoc291cmNlKTtcbiAgICAgICAgICAgIHNvdXJjZS5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLnJlY2VpdmVNZXNzYWdlRXZlbnQsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdHJlYW1Tb3VyY2VJc0Nvbm5lY3RlZChzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlcy5oYXMoc291cmNlKTtcbiAgICB9XG4gICAgYXN5bmMgcmVjZWl2ZU1lc3NhZ2VSZXNwb25zZShyZXNwb25zZSkge1xuICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcmVzcG9uc2UucmVzcG9uc2VIVE1MO1xuICAgICAgICBpZiAoaHRtbCkge1xuICAgICAgICAgICAgdGhpcy5yZWNlaXZlTWVzc2FnZUhUTUwoaHRtbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVjZWl2ZU1lc3NhZ2VIVE1MKGh0bWwpIHtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZS5yZWNlaXZlZE1lc3NhZ2VGcm9tU3RyZWFtKG5ldyBTdHJlYW1NZXNzYWdlKGh0bWwpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBmZXRjaFJlc3BvbnNlRnJvbUV2ZW50KGV2ZW50KSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IGZldGNoUmVzcG9uc2UgPSAoX2EgPSBldmVudC5kZXRhaWwpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mZXRjaFJlc3BvbnNlO1xuICAgIGlmIChmZXRjaFJlc3BvbnNlIGluc3RhbmNlb2YgRmV0Y2hSZXNwb25zZSkge1xuICAgICAgICByZXR1cm4gZmV0Y2hSZXNwb25zZTtcbiAgICB9XG59XG5mdW5jdGlvbiBmZXRjaFJlc3BvbnNlSXNTdHJlYW0ocmVzcG9uc2UpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgY29udGVudFR5cGUgPSAoX2EgPSByZXNwb25zZS5jb250ZW50VHlwZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogXCJcIjtcbiAgICByZXR1cm4gY29udGVudFR5cGUuc3RhcnRzV2l0aChTdHJlYW1NZXNzYWdlLmNvbnRlbnRUeXBlKTtcbn1cblxuY2xhc3MgRXJyb3JSZW5kZXJlciBleHRlbmRzIFJlbmRlcmVyIHtcbiAgICBhc3luYyByZW5kZXIoKSB7XG4gICAgICAgIHRoaXMucmVwbGFjZUhlYWRBbmRCb2R5KCk7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVTY3JpcHRFbGVtZW50cygpO1xuICAgIH1cbiAgICByZXBsYWNlSGVhZEFuZEJvZHkoKSB7XG4gICAgICAgIGNvbnN0IHsgZG9jdW1lbnRFbGVtZW50LCBoZWFkLCBib2R5IH0gPSBkb2N1bWVudDtcbiAgICAgICAgZG9jdW1lbnRFbGVtZW50LnJlcGxhY2VDaGlsZCh0aGlzLm5ld0hlYWQsIGhlYWQpO1xuICAgICAgICBkb2N1bWVudEVsZW1lbnQucmVwbGFjZUNoaWxkKHRoaXMubmV3RWxlbWVudCwgYm9keSk7XG4gICAgfVxuICAgIGFjdGl2YXRlU2NyaXB0RWxlbWVudHMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgcmVwbGFjZWFibGVFbGVtZW50IG9mIHRoaXMuc2NyaXB0RWxlbWVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSByZXBsYWNlYWJsZUVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGlmIChwYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuY3JlYXRlU2NyaXB0RWxlbWVudChyZXBsYWNlYWJsZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGVsZW1lbnQsIHJlcGxhY2VhYmxlRWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IG5ld0hlYWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5ld1NuYXBzaG90LmhlYWRTbmFwc2hvdC5lbGVtZW50O1xuICAgIH1cbiAgICBnZXQgc2NyaXB0RWxlbWVudHMoKSB7XG4gICAgICAgIHJldHVybiBbLi4uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzY3JpcHRcIildO1xuICAgIH1cbn1cblxuY2xhc3MgUGFnZVJlbmRlcmVyIGV4dGVuZHMgUmVuZGVyZXIge1xuICAgIGdldCBzaG91bGRSZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5ld1NuYXBzaG90LmlzVmlzaXRhYmxlICYmIHRoaXMudHJhY2tlZEVsZW1lbnRzQXJlSWRlbnRpY2FsO1xuICAgIH1cbiAgICBwcmVwYXJlVG9SZW5kZXIoKSB7XG4gICAgICAgIHRoaXMubWVyZ2VIZWFkKCk7XG4gICAgfVxuICAgIGFzeW5jIHJlbmRlcigpIHtcbiAgICAgICAgdGhpcy5yZXBsYWNlQm9keSgpO1xuICAgIH1cbiAgICBmaW5pc2hSZW5kZXJpbmcoKSB7XG4gICAgICAgIHN1cGVyLmZpbmlzaFJlbmRlcmluZygpO1xuICAgICAgICBpZiAoIXRoaXMuaXNQcmV2aWV3KSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzRmlyc3RBdXRvZm9jdXNhYmxlRWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBjdXJyZW50SGVhZFNuYXBzaG90KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50U25hcHNob3QuaGVhZFNuYXBzaG90O1xuICAgIH1cbiAgICBnZXQgbmV3SGVhZFNuYXBzaG90KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXdTbmFwc2hvdC5oZWFkU25hcHNob3Q7XG4gICAgfVxuICAgIGdldCBuZXdFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXdTbmFwc2hvdC5lbGVtZW50O1xuICAgIH1cbiAgICBtZXJnZUhlYWQoKSB7XG4gICAgICAgIHRoaXMuY29weU5ld0hlYWRTdHlsZXNoZWV0RWxlbWVudHMoKTtcbiAgICAgICAgdGhpcy5jb3B5TmV3SGVhZFNjcmlwdEVsZW1lbnRzKCk7XG4gICAgICAgIHRoaXMucmVtb3ZlQ3VycmVudEhlYWRQcm92aXNpb25hbEVsZW1lbnRzKCk7XG4gICAgICAgIHRoaXMuY29weU5ld0hlYWRQcm92aXNpb25hbEVsZW1lbnRzKCk7XG4gICAgfVxuICAgIHJlcGxhY2VCb2R5KCkge1xuICAgICAgICB0aGlzLnByZXNlcnZpbmdQZXJtYW5lbnRFbGVtZW50cygoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2YXRlTmV3Qm9keSgpO1xuICAgICAgICAgICAgdGhpcy5hc3NpZ25OZXdCb2R5KCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQgdHJhY2tlZEVsZW1lbnRzQXJlSWRlbnRpY2FsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50SGVhZFNuYXBzaG90LnRyYWNrZWRFbGVtZW50U2lnbmF0dXJlID09IHRoaXMubmV3SGVhZFNuYXBzaG90LnRyYWNrZWRFbGVtZW50U2lnbmF0dXJlO1xuICAgIH1cbiAgICBjb3B5TmV3SGVhZFN0eWxlc2hlZXRFbGVtZW50cygpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRoaXMubmV3SGVhZFN0eWxlc2hlZXRFbGVtZW50cykge1xuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb3B5TmV3SGVhZFNjcmlwdEVsZW1lbnRzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5uZXdIZWFkU2NyaXB0RWxlbWVudHMpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVTY3JpcHRFbGVtZW50KGVsZW1lbnQpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW1vdmVDdXJyZW50SGVhZFByb3Zpc2lvbmFsRWxlbWVudHMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLmN1cnJlbnRIZWFkUHJvdmlzaW9uYWxFbGVtZW50cykge1xuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb3B5TmV3SGVhZFByb3Zpc2lvbmFsRWxlbWVudHMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLm5ld0hlYWRQcm92aXNpb25hbEVsZW1lbnRzKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFjdGl2YXRlTmV3Qm9keSgpIHtcbiAgICAgICAgZG9jdW1lbnQuYWRvcHROb2RlKHRoaXMubmV3RWxlbWVudCk7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVOZXdCb2R5U2NyaXB0RWxlbWVudHMoKTtcbiAgICB9XG4gICAgYWN0aXZhdGVOZXdCb2R5U2NyaXB0RWxlbWVudHMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgaW5lcnRTY3JpcHRFbGVtZW50IG9mIHRoaXMubmV3Qm9keVNjcmlwdEVsZW1lbnRzKSB7XG4gICAgICAgICAgICBjb25zdCBhY3RpdmF0ZWRTY3JpcHRFbGVtZW50ID0gdGhpcy5jcmVhdGVTY3JpcHRFbGVtZW50KGluZXJ0U2NyaXB0RWxlbWVudCk7XG4gICAgICAgICAgICBpbmVydFNjcmlwdEVsZW1lbnQucmVwbGFjZVdpdGgoYWN0aXZhdGVkU2NyaXB0RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXNzaWduTmV3Qm9keSgpIHtcbiAgICAgICAgaWYgKGRvY3VtZW50LmJvZHkgJiYgdGhpcy5uZXdFbGVtZW50IGluc3RhbmNlb2YgSFRNTEJvZHlFbGVtZW50KSB7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlcGxhY2VXaXRoKHRoaXMubmV3RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5uZXdFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgbmV3SGVhZFN0eWxlc2hlZXRFbGVtZW50cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV3SGVhZFNuYXBzaG90LmdldFN0eWxlc2hlZXRFbGVtZW50c05vdEluU25hcHNob3QodGhpcy5jdXJyZW50SGVhZFNuYXBzaG90KTtcbiAgICB9XG4gICAgZ2V0IG5ld0hlYWRTY3JpcHRFbGVtZW50cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV3SGVhZFNuYXBzaG90LmdldFNjcmlwdEVsZW1lbnRzTm90SW5TbmFwc2hvdCh0aGlzLmN1cnJlbnRIZWFkU25hcHNob3QpO1xuICAgIH1cbiAgICBnZXQgY3VycmVudEhlYWRQcm92aXNpb25hbEVsZW1lbnRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50SGVhZFNuYXBzaG90LnByb3Zpc2lvbmFsRWxlbWVudHM7XG4gICAgfVxuICAgIGdldCBuZXdIZWFkUHJvdmlzaW9uYWxFbGVtZW50cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV3SGVhZFNuYXBzaG90LnByb3Zpc2lvbmFsRWxlbWVudHM7XG4gICAgfVxuICAgIGdldCBuZXdCb2R5U2NyaXB0RWxlbWVudHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5ld0VsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcInNjcmlwdFwiKTtcbiAgICB9XG59XG5cbmNsYXNzIFNuYXBzaG90Q2FjaGUge1xuICAgIGNvbnN0cnVjdG9yKHNpemUpIHtcbiAgICAgICAgdGhpcy5rZXlzID0gW107XG4gICAgICAgIHRoaXMuc25hcHNob3RzID0ge307XG4gICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7XG4gICAgfVxuICAgIGhhcyhsb2NhdGlvbikge1xuICAgICAgICByZXR1cm4gdG9DYWNoZUtleShsb2NhdGlvbikgaW4gdGhpcy5zbmFwc2hvdHM7XG4gICAgfVxuICAgIGdldChsb2NhdGlvbikge1xuICAgICAgICBpZiAodGhpcy5oYXMobG9jYXRpb24pKSB7XG4gICAgICAgICAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMucmVhZChsb2NhdGlvbik7XG4gICAgICAgICAgICB0aGlzLnRvdWNoKGxvY2F0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiBzbmFwc2hvdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdXQobG9jYXRpb24sIHNuYXBzaG90KSB7XG4gICAgICAgIHRoaXMud3JpdGUobG9jYXRpb24sIHNuYXBzaG90KTtcbiAgICAgICAgdGhpcy50b3VjaChsb2NhdGlvbik7XG4gICAgICAgIHJldHVybiBzbmFwc2hvdDtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuc25hcHNob3RzID0ge307XG4gICAgfVxuICAgIHJlYWQobG9jYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc25hcHNob3RzW3RvQ2FjaGVLZXkobG9jYXRpb24pXTtcbiAgICB9XG4gICAgd3JpdGUobG9jYXRpb24sIHNuYXBzaG90KSB7XG4gICAgICAgIHRoaXMuc25hcHNob3RzW3RvQ2FjaGVLZXkobG9jYXRpb24pXSA9IHNuYXBzaG90O1xuICAgIH1cbiAgICB0b3VjaChsb2NhdGlvbikge1xuICAgICAgICBjb25zdCBrZXkgPSB0b0NhY2hlS2V5KGxvY2F0aW9uKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmtleXMuaW5kZXhPZihrZXkpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSlcbiAgICAgICAgICAgIHRoaXMua2V5cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB0aGlzLmtleXMudW5zaGlmdChrZXkpO1xuICAgICAgICB0aGlzLnRyaW0oKTtcbiAgICB9XG4gICAgdHJpbSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5rZXlzLnNwbGljZSh0aGlzLnNpemUpKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5zbmFwc2hvdHNba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgUGFnZVZpZXcgZXh0ZW5kcyBWaWV3IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5zbmFwc2hvdENhY2hlID0gbmV3IFNuYXBzaG90Q2FjaGUoMTApO1xuICAgICAgICB0aGlzLmxhc3RSZW5kZXJlZExvY2F0aW9uID0gbmV3IFVSTChsb2NhdGlvbi5ocmVmKTtcbiAgICB9XG4gICAgcmVuZGVyUGFnZShzbmFwc2hvdCwgaXNQcmV2aWV3ID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgcmVuZGVyZXIgPSBuZXcgUGFnZVJlbmRlcmVyKHRoaXMuc25hcHNob3QsIHNuYXBzaG90LCBpc1ByZXZpZXcpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXIocmVuZGVyZXIpO1xuICAgIH1cbiAgICByZW5kZXJFcnJvcihzbmFwc2hvdCkge1xuICAgICAgICBjb25zdCByZW5kZXJlciA9IG5ldyBFcnJvclJlbmRlcmVyKHRoaXMuc25hcHNob3QsIHNuYXBzaG90LCBmYWxzZSk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlcihyZW5kZXJlcik7XG4gICAgfVxuICAgIGNsZWFyU25hcHNob3RDYWNoZSgpIHtcbiAgICAgICAgdGhpcy5zbmFwc2hvdENhY2hlLmNsZWFyKCk7XG4gICAgfVxuICAgIGFzeW5jIGNhY2hlU25hcHNob3QoKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZENhY2hlU25hcHNob3QpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUudmlld1dpbGxDYWNoZVNuYXBzaG90KCk7XG4gICAgICAgICAgICBjb25zdCB7IHNuYXBzaG90LCBsYXN0UmVuZGVyZWRMb2NhdGlvbjogbG9jYXRpb24gfSA9IHRoaXM7XG4gICAgICAgICAgICBhd2FpdCBuZXh0RXZlbnRMb29wVGljaygpO1xuICAgICAgICAgICAgdGhpcy5zbmFwc2hvdENhY2hlLnB1dChsb2NhdGlvbiwgc25hcHNob3QuY2xvbmUoKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0Q2FjaGVkU25hcHNob3RGb3JMb2NhdGlvbihsb2NhdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5zbmFwc2hvdENhY2hlLmdldChsb2NhdGlvbik7XG4gICAgfVxuICAgIGdldCBzbmFwc2hvdCgpIHtcbiAgICAgICAgcmV0dXJuIFBhZ2VTbmFwc2hvdC5mcm9tRWxlbWVudCh0aGlzLmVsZW1lbnQpO1xuICAgIH1cbiAgICBnZXQgc2hvdWxkQ2FjaGVTbmFwc2hvdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc25hcHNob3QuaXNDYWNoZWFibGU7XG4gICAgfVxufVxuXG5jbGFzcyBTZXNzaW9uIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0b3IgPSBuZXcgTmF2aWdhdG9yKHRoaXMpO1xuICAgICAgICB0aGlzLmhpc3RvcnkgPSBuZXcgSGlzdG9yeSh0aGlzKTtcbiAgICAgICAgdGhpcy52aWV3ID0gbmV3IFBhZ2VWaWV3KHRoaXMsIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIHRoaXMuYWRhcHRlciA9IG5ldyBCcm93c2VyQWRhcHRlcih0aGlzKTtcbiAgICAgICAgdGhpcy5wYWdlT2JzZXJ2ZXIgPSBuZXcgUGFnZU9ic2VydmVyKHRoaXMpO1xuICAgICAgICB0aGlzLmNhY2hlT2JzZXJ2ZXIgPSBuZXcgQ2FjaGVPYnNlcnZlcigpO1xuICAgICAgICB0aGlzLmxpbmtDbGlja09ic2VydmVyID0gbmV3IExpbmtDbGlja09ic2VydmVyKHRoaXMpO1xuICAgICAgICB0aGlzLmZvcm1TdWJtaXRPYnNlcnZlciA9IG5ldyBGb3JtU3VibWl0T2JzZXJ2ZXIodGhpcyk7XG4gICAgICAgIHRoaXMuc2Nyb2xsT2JzZXJ2ZXIgPSBuZXcgU2Nyb2xsT2JzZXJ2ZXIodGhpcyk7XG4gICAgICAgIHRoaXMuc3RyZWFtT2JzZXJ2ZXIgPSBuZXcgU3RyZWFtT2JzZXJ2ZXIodGhpcyk7XG4gICAgICAgIHRoaXMuZnJhbWVSZWRpcmVjdG9yID0gbmV3IEZyYW1lUmVkaXJlY3Rvcihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgICAgICB0aGlzLmRyaXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wcm9ncmVzc0JhckRlbGF5ID0gNTAwO1xuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgc3RhcnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2VPYnNlcnZlci5zdGFydCgpO1xuICAgICAgICAgICAgdGhpcy5jYWNoZU9ic2VydmVyLnN0YXJ0KCk7XG4gICAgICAgICAgICB0aGlzLmxpbmtDbGlja09ic2VydmVyLnN0YXJ0KCk7XG4gICAgICAgICAgICB0aGlzLmZvcm1TdWJtaXRPYnNlcnZlci5zdGFydCgpO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxPYnNlcnZlci5zdGFydCgpO1xuICAgICAgICAgICAgdGhpcy5zdHJlYW1PYnNlcnZlci5zdGFydCgpO1xuICAgICAgICAgICAgdGhpcy5mcmFtZVJlZGlyZWN0b3Iuc3RhcnQoKTtcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5zdGFydCgpO1xuICAgICAgICAgICAgdGhpcy5zdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2U7XG4gICAgfVxuICAgIHN0b3AoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMucGFnZU9ic2VydmVyLnN0b3AoKTtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVPYnNlcnZlci5zdG9wKCk7XG4gICAgICAgICAgICB0aGlzLmxpbmtDbGlja09ic2VydmVyLnN0b3AoKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybVN1Ym1pdE9ic2VydmVyLnN0b3AoKTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsT2JzZXJ2ZXIuc3RvcCgpO1xuICAgICAgICAgICAgdGhpcy5zdHJlYW1PYnNlcnZlci5zdG9wKCk7XG4gICAgICAgICAgICB0aGlzLmZyYW1lUmVkaXJlY3Rvci5zdG9wKCk7XG4gICAgICAgICAgICB0aGlzLmhpc3Rvcnkuc3RvcCgpO1xuICAgICAgICAgICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVnaXN0ZXJBZGFwdGVyKGFkYXB0ZXIpIHtcbiAgICAgICAgdGhpcy5hZGFwdGVyID0gYWRhcHRlcjtcbiAgICB9XG4gICAgdmlzaXQobG9jYXRpb24sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLm5hdmlnYXRvci5wcm9wb3NlVmlzaXQoZXhwYW5kVVJMKGxvY2F0aW9uKSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGNvbm5lY3RTdHJlYW1Tb3VyY2Uoc291cmNlKSB7XG4gICAgICAgIHRoaXMuc3RyZWFtT2JzZXJ2ZXIuY29ubmVjdFN0cmVhbVNvdXJjZShzb3VyY2UpO1xuICAgIH1cbiAgICBkaXNjb25uZWN0U3RyZWFtU291cmNlKHNvdXJjZSkge1xuICAgICAgICB0aGlzLnN0cmVhbU9ic2VydmVyLmRpc2Nvbm5lY3RTdHJlYW1Tb3VyY2Uoc291cmNlKTtcbiAgICB9XG4gICAgcmVuZGVyU3RyZWFtTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChTdHJlYW1NZXNzYWdlLndyYXAobWVzc2FnZSkuZnJhZ21lbnQpO1xuICAgIH1cbiAgICBjbGVhckNhY2hlKCkge1xuICAgICAgICB0aGlzLnZpZXcuY2xlYXJTbmFwc2hvdENhY2hlKCk7XG4gICAgfVxuICAgIHNldFByb2dyZXNzQmFyRGVsYXkoZGVsYXkpIHtcbiAgICAgICAgdGhpcy5wcm9ncmVzc0JhckRlbGF5ID0gZGVsYXk7XG4gICAgfVxuICAgIGdldCBsb2NhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGlzdG9yeS5sb2NhdGlvbjtcbiAgICB9XG4gICAgZ2V0IHJlc3RvcmF0aW9uSWRlbnRpZmllcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGlzdG9yeS5yZXN0b3JhdGlvbklkZW50aWZpZXI7XG4gICAgfVxuICAgIGhpc3RvcnlQb3BwZWRUb0xvY2F0aW9uV2l0aFJlc3RvcmF0aW9uSWRlbnRpZmllcihsb2NhdGlvbiwgcmVzdG9yYXRpb25JZGVudGlmaWVyKSB7XG4gICAgICAgIGlmICh0aGlzLmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdG9yLnN0YXJ0VmlzaXQobG9jYXRpb24sIHJlc3RvcmF0aW9uSWRlbnRpZmllciwgeyBhY3Rpb246IFwicmVzdG9yZVwiLCBoaXN0b3J5Q2hhbmdlZDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWRhcHRlci5wYWdlSW52YWxpZGF0ZWQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzY3JvbGxQb3NpdGlvbkNoYW5nZWQocG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnVwZGF0ZVJlc3RvcmF0aW9uRGF0YSh7IHNjcm9sbFBvc2l0aW9uOiBwb3NpdGlvbiB9KTtcbiAgICB9XG4gICAgd2lsbEZvbGxvd0xpbmtUb0xvY2F0aW9uKGxpbmssIGxvY2F0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnREcml2ZUVuYWJsZWQobGluaylcbiAgICAgICAgICAgICYmIHRoaXMubG9jYXRpb25Jc1Zpc2l0YWJsZShsb2NhdGlvbilcbiAgICAgICAgICAgICYmIHRoaXMuYXBwbGljYXRpb25BbGxvd3NGb2xsb3dpbmdMaW5rVG9Mb2NhdGlvbihsaW5rLCBsb2NhdGlvbik7XG4gICAgfVxuICAgIGZvbGxvd2VkTGlua1RvTG9jYXRpb24obGluaywgbG9jYXRpb24pIHtcbiAgICAgICAgY29uc3QgYWN0aW9uID0gdGhpcy5nZXRBY3Rpb25Gb3JMaW5rKGxpbmspO1xuICAgICAgICB0aGlzLmNvbnZlcnRMaW5rV2l0aE1ldGhvZENsaWNrVG9Gb3JtU3VibWlzc2lvbihsaW5rKSB8fCB0aGlzLnZpc2l0KGxvY2F0aW9uLmhyZWYsIHsgYWN0aW9uIH0pO1xuICAgIH1cbiAgICBjb252ZXJ0TGlua1dpdGhNZXRob2RDbGlja1RvRm9ybVN1Ym1pc3Npb24obGluaykge1xuICAgICAgICBjb25zdCBsaW5rTWV0aG9kID0gbGluay5nZXRBdHRyaWJ1dGUoXCJkYXRhLXR1cmJvLW1ldGhvZFwiKTtcbiAgICAgICAgaWYgKGxpbmtNZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiKTtcbiAgICAgICAgICAgIGZvcm0ubWV0aG9kID0gbGlua01ldGhvZDtcbiAgICAgICAgICAgIGZvcm0uYWN0aW9uID0gbGluay5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpIHx8IFwidW5kZWZpbmVkXCI7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGZvcm0pO1xuICAgICAgICAgICAgcmV0dXJuIGRpc3BhdGNoKFwic3VibWl0XCIsIHsgY2FuY2VsYWJsZTogdHJ1ZSwgdGFyZ2V0OiBmb3JtIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFsbG93c1Zpc2l0aW5nTG9jYXRpb25XaXRoQWN0aW9uKGxvY2F0aW9uLCBhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYXRpb25XaXRoQWN0aW9uSXNTYW1lUGFnZShsb2NhdGlvbiwgYWN0aW9uKSB8fCB0aGlzLmFwcGxpY2F0aW9uQWxsb3dzVmlzaXRpbmdMb2NhdGlvbihsb2NhdGlvbik7XG4gICAgfVxuICAgIHZpc2l0UHJvcG9zZWRUb0xvY2F0aW9uKGxvY2F0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIGV4dGVuZFVSTFdpdGhEZXByZWNhdGVkUHJvcGVydGllcyhsb2NhdGlvbik7XG4gICAgICAgIHRoaXMuYWRhcHRlci52aXNpdFByb3Bvc2VkVG9Mb2NhdGlvbihsb2NhdGlvbiwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHZpc2l0U3RhcnRlZCh2aXNpdCkge1xuICAgICAgICBleHRlbmRVUkxXaXRoRGVwcmVjYXRlZFByb3BlcnRpZXModmlzaXQubG9jYXRpb24pO1xuICAgICAgICBpZiAoIXZpc2l0LnNpbGVudCkge1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlBcHBsaWNhdGlvbkFmdGVyVmlzaXRpbmdMb2NhdGlvbih2aXNpdC5sb2NhdGlvbiwgdmlzaXQuYWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdENvbXBsZXRlZCh2aXNpdCkge1xuICAgICAgICB0aGlzLm5vdGlmeUFwcGxpY2F0aW9uQWZ0ZXJQYWdlTG9hZCh2aXNpdC5nZXRUaW1pbmdNZXRyaWNzKCkpO1xuICAgIH1cbiAgICBsb2NhdGlvbldpdGhBY3Rpb25Jc1NhbWVQYWdlKGxvY2F0aW9uLCBhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmF2aWdhdG9yLmxvY2F0aW9uV2l0aEFjdGlvbklzU2FtZVBhZ2UobG9jYXRpb24sIGFjdGlvbik7XG4gICAgfVxuICAgIHZpc2l0U2Nyb2xsZWRUb1NhbWVQYWdlTG9jYXRpb24ob2xkVVJMLCBuZXdVUkwpIHtcbiAgICAgICAgdGhpcy5ub3RpZnlBcHBsaWNhdGlvbkFmdGVyVmlzaXRpbmdTYW1lUGFnZUxvY2F0aW9uKG9sZFVSTCwgbmV3VVJMKTtcbiAgICB9XG4gICAgd2lsbFN1Ym1pdEZvcm0oZm9ybSwgc3VibWl0dGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnREcml2ZUVuYWJsZWQoZm9ybSkgJiYgdGhpcy5lbGVtZW50RHJpdmVFbmFibGVkKHN1Ym1pdHRlcik7XG4gICAgfVxuICAgIGZvcm1TdWJtaXR0ZWQoZm9ybSwgc3VibWl0dGVyKSB7XG4gICAgICAgIHRoaXMubmF2aWdhdG9yLnN1Ym1pdEZvcm0oZm9ybSwgc3VibWl0dGVyKTtcbiAgICB9XG4gICAgcGFnZUJlY2FtZUludGVyYWN0aXZlKCkge1xuICAgICAgICB0aGlzLnZpZXcubGFzdFJlbmRlcmVkTG9jYXRpb24gPSB0aGlzLmxvY2F0aW9uO1xuICAgICAgICB0aGlzLm5vdGlmeUFwcGxpY2F0aW9uQWZ0ZXJQYWdlTG9hZCgpO1xuICAgIH1cbiAgICBwYWdlTG9hZGVkKCkge1xuICAgICAgICB0aGlzLmhpc3RvcnkuYXNzdW1lQ29udHJvbE9mU2Nyb2xsUmVzdG9yYXRpb24oKTtcbiAgICB9XG4gICAgcGFnZVdpbGxVbmxvYWQoKSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5yZWxpbnF1aXNoQ29udHJvbE9mU2Nyb2xsUmVzdG9yYXRpb24oKTtcbiAgICB9XG4gICAgcmVjZWl2ZWRNZXNzYWdlRnJvbVN0cmVhbShtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMucmVuZGVyU3RyZWFtTWVzc2FnZShtZXNzYWdlKTtcbiAgICB9XG4gICAgdmlld1dpbGxDYWNoZVNuYXBzaG90KCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICghKChfYSA9IHRoaXMubmF2aWdhdG9yLmN1cnJlbnRWaXNpdCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNpbGVudCkpIHtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5QXBwbGljYXRpb25CZWZvcmVDYWNoaW5nU25hcHNob3QoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhbGxvd3NJbW1lZGlhdGVSZW5kZXIoeyBlbGVtZW50IH0sIHJlc3VtZSkge1xuICAgICAgICBjb25zdCBldmVudCA9IHRoaXMubm90aWZ5QXBwbGljYXRpb25CZWZvcmVSZW5kZXIoZWxlbWVudCwgcmVzdW1lKTtcbiAgICAgICAgcmV0dXJuICFldmVudC5kZWZhdWx0UHJldmVudGVkO1xuICAgIH1cbiAgICB2aWV3UmVuZGVyZWRTbmFwc2hvdChzbmFwc2hvdCwgaXNQcmV2aWV3KSB7XG4gICAgICAgIHRoaXMudmlldy5sYXN0UmVuZGVyZWRMb2NhdGlvbiA9IHRoaXMuaGlzdG9yeS5sb2NhdGlvbjtcbiAgICAgICAgdGhpcy5ub3RpZnlBcHBsaWNhdGlvbkFmdGVyUmVuZGVyKCk7XG4gICAgfVxuICAgIHZpZXdJbnZhbGlkYXRlZCgpIHtcbiAgICAgICAgdGhpcy5hZGFwdGVyLnBhZ2VJbnZhbGlkYXRlZCgpO1xuICAgIH1cbiAgICBmcmFtZUxvYWRlZChmcmFtZSkge1xuICAgICAgICB0aGlzLm5vdGlmeUFwcGxpY2F0aW9uQWZ0ZXJGcmFtZUxvYWQoZnJhbWUpO1xuICAgIH1cbiAgICBmcmFtZVJlbmRlcmVkKGZldGNoUmVzcG9uc2UsIGZyYW1lKSB7XG4gICAgICAgIHRoaXMubm90aWZ5QXBwbGljYXRpb25BZnRlckZyYW1lUmVuZGVyKGZldGNoUmVzcG9uc2UsIGZyYW1lKTtcbiAgICB9XG4gICAgYXBwbGljYXRpb25BbGxvd3NGb2xsb3dpbmdMaW5rVG9Mb2NhdGlvbihsaW5rLCBsb2NhdGlvbikge1xuICAgICAgICBjb25zdCBldmVudCA9IHRoaXMubm90aWZ5QXBwbGljYXRpb25BZnRlckNsaWNraW5nTGlua1RvTG9jYXRpb24obGluaywgbG9jYXRpb24pO1xuICAgICAgICByZXR1cm4gIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQ7XG4gICAgfVxuICAgIGFwcGxpY2F0aW9uQWxsb3dzVmlzaXRpbmdMb2NhdGlvbihsb2NhdGlvbikge1xuICAgICAgICBjb25zdCBldmVudCA9IHRoaXMubm90aWZ5QXBwbGljYXRpb25CZWZvcmVWaXNpdGluZ0xvY2F0aW9uKGxvY2F0aW9uKTtcbiAgICAgICAgcmV0dXJuICFldmVudC5kZWZhdWx0UHJldmVudGVkO1xuICAgIH1cbiAgICBub3RpZnlBcHBsaWNhdGlvbkFmdGVyQ2xpY2tpbmdMaW5rVG9Mb2NhdGlvbihsaW5rLCBsb2NhdGlvbikge1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2goXCJ0dXJibzpjbGlja1wiLCB7IHRhcmdldDogbGluaywgZGV0YWlsOiB7IHVybDogbG9jYXRpb24uaHJlZiB9LCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgIH1cbiAgICBub3RpZnlBcHBsaWNhdGlvbkJlZm9yZVZpc2l0aW5nTG9jYXRpb24obG9jYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGRpc3BhdGNoKFwidHVyYm86YmVmb3JlLXZpc2l0XCIsIHsgZGV0YWlsOiB7IHVybDogbG9jYXRpb24uaHJlZiB9LCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgIH1cbiAgICBub3RpZnlBcHBsaWNhdGlvbkFmdGVyVmlzaXRpbmdMb2NhdGlvbihsb2NhdGlvbiwgYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBkaXNwYXRjaChcInR1cmJvOnZpc2l0XCIsIHsgZGV0YWlsOiB7IHVybDogbG9jYXRpb24uaHJlZiwgYWN0aW9uIH0gfSk7XG4gICAgfVxuICAgIG5vdGlmeUFwcGxpY2F0aW9uQmVmb3JlQ2FjaGluZ1NuYXBzaG90KCkge1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2goXCJ0dXJibzpiZWZvcmUtY2FjaGVcIik7XG4gICAgfVxuICAgIG5vdGlmeUFwcGxpY2F0aW9uQmVmb3JlUmVuZGVyKG5ld0JvZHksIHJlc3VtZSkge1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2goXCJ0dXJibzpiZWZvcmUtcmVuZGVyXCIsIHsgZGV0YWlsOiB7IG5ld0JvZHksIHJlc3VtZSB9LCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgIH1cbiAgICBub3RpZnlBcHBsaWNhdGlvbkFmdGVyUmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2goXCJ0dXJibzpyZW5kZXJcIik7XG4gICAgfVxuICAgIG5vdGlmeUFwcGxpY2F0aW9uQWZ0ZXJQYWdlTG9hZCh0aW1pbmcgPSB7fSkge1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2goXCJ0dXJibzpsb2FkXCIsIHsgZGV0YWlsOiB7IHVybDogdGhpcy5sb2NhdGlvbi5ocmVmLCB0aW1pbmcgfSB9KTtcbiAgICB9XG4gICAgbm90aWZ5QXBwbGljYXRpb25BZnRlclZpc2l0aW5nU2FtZVBhZ2VMb2NhdGlvbihvbGRVUkwsIG5ld1VSTCkge1xuICAgICAgICBkaXNwYXRjaEV2ZW50KG5ldyBIYXNoQ2hhbmdlRXZlbnQoXCJoYXNoY2hhbmdlXCIsIHsgb2xkVVJMOiBvbGRVUkwudG9TdHJpbmcoKSwgbmV3VVJMOiBuZXdVUkwudG9TdHJpbmcoKSB9KSk7XG4gICAgfVxuICAgIG5vdGlmeUFwcGxpY2F0aW9uQWZ0ZXJGcmFtZUxvYWQoZnJhbWUpIHtcbiAgICAgICAgcmV0dXJuIGRpc3BhdGNoKFwidHVyYm86ZnJhbWUtbG9hZFwiLCB7IHRhcmdldDogZnJhbWUgfSk7XG4gICAgfVxuICAgIG5vdGlmeUFwcGxpY2F0aW9uQWZ0ZXJGcmFtZVJlbmRlcihmZXRjaFJlc3BvbnNlLCBmcmFtZSkge1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2goXCJ0dXJibzpmcmFtZS1yZW5kZXJcIiwgeyBkZXRhaWw6IHsgZmV0Y2hSZXNwb25zZSB9LCB0YXJnZXQ6IGZyYW1lLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgIH1cbiAgICBlbGVtZW50RHJpdmVFbmFibGVkKGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbGVtZW50LmNsb3Nlc3QoXCJbZGF0YS10dXJib11cIik7XG4gICAgICAgIGlmICh0aGlzLmRyaXZlKSB7XG4gICAgICAgICAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5nZXRBdHRyaWJ1dGUoXCJkYXRhLXR1cmJvXCIpICE9IFwiZmFsc2VcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuZ2V0QXR0cmlidXRlKFwiZGF0YS10dXJib1wiKSA9PSBcInRydWVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRBY3Rpb25Gb3JMaW5rKGxpbmspIHtcbiAgICAgICAgY29uc3QgYWN0aW9uID0gbGluay5nZXRBdHRyaWJ1dGUoXCJkYXRhLXR1cmJvLWFjdGlvblwiKTtcbiAgICAgICAgcmV0dXJuIGlzQWN0aW9uKGFjdGlvbikgPyBhY3Rpb24gOiBcImFkdmFuY2VcIjtcbiAgICB9XG4gICAgbG9jYXRpb25Jc1Zpc2l0YWJsZShsb2NhdGlvbikge1xuICAgICAgICByZXR1cm4gaXNQcmVmaXhlZEJ5KGxvY2F0aW9uLCB0aGlzLnNuYXBzaG90LnJvb3RMb2NhdGlvbikgJiYgaXNIVE1MKGxvY2F0aW9uKTtcbiAgICB9XG4gICAgZ2V0IHNuYXBzaG90KCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LnNuYXBzaG90O1xuICAgIH1cbn1cbmZ1bmN0aW9uIGV4dGVuZFVSTFdpdGhEZXByZWNhdGVkUHJvcGVydGllcyh1cmwpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh1cmwsIGRlcHJlY2F0ZWRMb2NhdGlvblByb3BlcnR5RGVzY3JpcHRvcnMpO1xufVxuY29uc3QgZGVwcmVjYXRlZExvY2F0aW9uUHJvcGVydHlEZXNjcmlwdG9ycyA9IHtcbiAgICBhYnNvbHV0ZVVSTDoge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuY29uc3Qgc2Vzc2lvbiA9IG5ldyBTZXNzaW9uO1xuY29uc3QgeyBuYXZpZ2F0b3IgfSA9IHNlc3Npb247XG5mdW5jdGlvbiBzdGFydCgpIHtcbiAgICBzZXNzaW9uLnN0YXJ0KCk7XG59XG5mdW5jdGlvbiByZWdpc3RlckFkYXB0ZXIoYWRhcHRlcikge1xuICAgIHNlc3Npb24ucmVnaXN0ZXJBZGFwdGVyKGFkYXB0ZXIpO1xufVxuZnVuY3Rpb24gdmlzaXQobG9jYXRpb24sIG9wdGlvbnMpIHtcbiAgICBzZXNzaW9uLnZpc2l0KGxvY2F0aW9uLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIGNvbm5lY3RTdHJlYW1Tb3VyY2Uoc291cmNlKSB7XG4gICAgc2Vzc2lvbi5jb25uZWN0U3RyZWFtU291cmNlKHNvdXJjZSk7XG59XG5mdW5jdGlvbiBkaXNjb25uZWN0U3RyZWFtU291cmNlKHNvdXJjZSkge1xuICAgIHNlc3Npb24uZGlzY29ubmVjdFN0cmVhbVNvdXJjZShzb3VyY2UpO1xufVxuZnVuY3Rpb24gcmVuZGVyU3RyZWFtTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgc2Vzc2lvbi5yZW5kZXJTdHJlYW1NZXNzYWdlKG1lc3NhZ2UpO1xufVxuZnVuY3Rpb24gY2xlYXJDYWNoZSgpIHtcbiAgICBzZXNzaW9uLmNsZWFyQ2FjaGUoKTtcbn1cbmZ1bmN0aW9uIHNldFByb2dyZXNzQmFyRGVsYXkoZGVsYXkpIHtcbiAgICBzZXNzaW9uLnNldFByb2dyZXNzQmFyRGVsYXkoZGVsYXkpO1xufVxuXG52YXIgVHVyYm8gPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIG5hdmlnYXRvcjogbmF2aWdhdG9yLFxuICAgIHNlc3Npb246IHNlc3Npb24sXG4gICAgUGFnZVJlbmRlcmVyOiBQYWdlUmVuZGVyZXIsXG4gICAgUGFnZVNuYXBzaG90OiBQYWdlU25hcHNob3QsXG4gICAgc3RhcnQ6IHN0YXJ0LFxuICAgIHJlZ2lzdGVyQWRhcHRlcjogcmVnaXN0ZXJBZGFwdGVyLFxuICAgIHZpc2l0OiB2aXNpdCxcbiAgICBjb25uZWN0U3RyZWFtU291cmNlOiBjb25uZWN0U3RyZWFtU291cmNlLFxuICAgIGRpc2Nvbm5lY3RTdHJlYW1Tb3VyY2U6IGRpc2Nvbm5lY3RTdHJlYW1Tb3VyY2UsXG4gICAgcmVuZGVyU3RyZWFtTWVzc2FnZTogcmVuZGVyU3RyZWFtTWVzc2FnZSxcbiAgICBjbGVhckNhY2hlOiBjbGVhckNhY2hlLFxuICAgIHNldFByb2dyZXNzQmFyRGVsYXk6IHNldFByb2dyZXNzQmFyRGVsYXlcbn0pO1xuXG5jbGFzcyBGcmFtZUNvbnRyb2xsZXIge1xuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5yZXNvbHZlVmlzaXRQcm9taXNlID0gKCkgPT4geyB9O1xuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmhhc0JlZW5Mb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZXR0aW5nU291cmNlVVJMID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMudmlldyA9IG5ldyBGcmFtZVZpZXcodGhpcywgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgdGhpcy5hcHBlYXJhbmNlT2JzZXJ2ZXIgPSBuZXcgQXBwZWFyYW5jZU9ic2VydmVyKHRoaXMsIHRoaXMuZWxlbWVudCk7XG4gICAgICAgIHRoaXMubGlua0ludGVyY2VwdG9yID0gbmV3IExpbmtJbnRlcmNlcHRvcih0aGlzLCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICB0aGlzLmZvcm1JbnRlcmNlcHRvciA9IG5ldyBGb3JtSW50ZXJjZXB0b3IodGhpcywgdGhpcy5lbGVtZW50KTtcbiAgICB9XG4gICAgY29ubmVjdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5yZWxvYWRhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5sb2FkaW5nU3R5bGUgPT0gRnJhbWVMb2FkaW5nU3R5bGUubGF6eSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZWFyYW5jZU9ic2VydmVyLnN0YXJ0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxpbmtJbnRlcmNlcHRvci5zdGFydCgpO1xuICAgICAgICAgICAgdGhpcy5mb3JtSW50ZXJjZXB0b3Iuc3RhcnQoKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlVVJMQ2hhbmdlZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc2Nvbm5lY3QoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYXBwZWFyYW5jZU9ic2VydmVyLnN0b3AoKTtcbiAgICAgICAgICAgIHRoaXMubGlua0ludGVyY2VwdG9yLnN0b3AoKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUludGVyY2VwdG9yLnN0b3AoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkaXNhYmxlZENoYW5nZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLmxvYWRpbmdTdHlsZSA9PSBGcmFtZUxvYWRpbmdTdHlsZS5lYWdlcikge1xuICAgICAgICAgICAgdGhpcy5sb2FkU291cmNlVVJMKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc291cmNlVVJMQ2hhbmdlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMubG9hZGluZ1N0eWxlID09IEZyYW1lTG9hZGluZ1N0eWxlLmVhZ2VyIHx8IHRoaXMuaGFzQmVlbkxvYWRlZCkge1xuICAgICAgICAgICAgdGhpcy5sb2FkU291cmNlVVJMKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbG9hZGluZ1N0eWxlQ2hhbmdlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMubG9hZGluZ1N0eWxlID09IEZyYW1lTG9hZGluZ1N0eWxlLmxhenkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZWFyYW5jZU9ic2VydmVyLnN0YXJ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVhcmFuY2VPYnNlcnZlci5zdG9wKCk7XG4gICAgICAgICAgICB0aGlzLmxvYWRTb3VyY2VVUkwoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBsb2FkU291cmNlVVJMKCkge1xuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ1NvdXJjZVVSTCAmJiB0aGlzLmVuYWJsZWQgJiYgdGhpcy5pc0FjdGl2ZSAmJiAodGhpcy5yZWxvYWRhYmxlIHx8IHRoaXMuc291cmNlVVJMICE9IHRoaXMuY3VycmVudFVSTCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzVVJMID0gdGhpcy5jdXJyZW50VVJMO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VVJMID0gdGhpcy5zb3VyY2VVUkw7XG4gICAgICAgICAgICBpZiAodGhpcy5zb3VyY2VVUkwpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQubG9hZGVkID0gdGhpcy52aXNpdCh0aGlzLnNvdXJjZVVSTCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwZWFyYW5jZU9ic2VydmVyLnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lbGVtZW50LmxvYWRlZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNCZWVuTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5mcmFtZUxvYWRlZCh0aGlzLmVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VVJMID0gcHJldmlvdXNVUkw7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBsb2FkUmVzcG9uc2UoZmV0Y2hSZXNwb25zZSkge1xuICAgICAgICBpZiAoZmV0Y2hSZXNwb25zZS5yZWRpcmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZVVSTCA9IGZldGNoUmVzcG9uc2UucmVzcG9uc2UudXJsO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgZmV0Y2hSZXNwb25zZS5yZXNwb25zZUhUTUw7XG4gICAgICAgICAgICBpZiAoaHRtbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgYm9keSB9ID0gcGFyc2VIVE1MRG9jdW1lbnQoaHRtbCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc25hcHNob3QgPSBuZXcgU25hcHNob3QoYXdhaXQgdGhpcy5leHRyYWN0Rm9yZWlnbkZyYW1lRWxlbWVudChib2R5KSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVuZGVyZXIgPSBuZXcgRnJhbWVSZW5kZXJlcih0aGlzLnZpZXcuc25hcHNob3QsIHNuYXBzaG90LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy5yZW5kZXJQcm9taXNlKVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnZpZXcucmVuZGVyUHJvbWlzZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnZpZXcucmVuZGVyKHJlbmRlcmVyKTtcbiAgICAgICAgICAgICAgICBzZXNzaW9uLmZyYW1lUmVuZGVyZWQoZmV0Y2hSZXNwb25zZSwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy52aWV3LmludmFsaWRhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbGVtZW50QXBwZWFyZWRJblZpZXdwb3J0KGVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5sb2FkU291cmNlVVJMKCk7XG4gICAgfVxuICAgIHNob3VsZEludGVyY2VwdExpbmtDbGljayhlbGVtZW50LCB1cmwpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiZGF0YS10dXJiby1tZXRob2RcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNob3VsZEludGVyY2VwdE5hdmlnYXRpb24oZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGlua0NsaWNrSW50ZXJjZXB0ZWQoZWxlbWVudCwgdXJsKSB7XG4gICAgICAgIHRoaXMucmVsb2FkYWJsZSA9IHRydWU7XG4gICAgICAgIHRoaXMubmF2aWdhdGVGcmFtZShlbGVtZW50LCB1cmwpO1xuICAgIH1cbiAgICBzaG91bGRJbnRlcmNlcHRGb3JtU3VibWlzc2lvbihlbGVtZW50LCBzdWJtaXR0ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvdWxkSW50ZXJjZXB0TmF2aWdhdGlvbihlbGVtZW50LCBzdWJtaXR0ZXIpO1xuICAgIH1cbiAgICBmb3JtU3VibWlzc2lvbkludGVyY2VwdGVkKGVsZW1lbnQsIHN1Ym1pdHRlcikge1xuICAgICAgICBpZiAodGhpcy5mb3JtU3VibWlzc2lvbikge1xuICAgICAgICAgICAgdGhpcy5mb3JtU3VibWlzc2lvbi5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWxvYWRhYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZm9ybVN1Ym1pc3Npb24gPSBuZXcgRm9ybVN1Ym1pc3Npb24odGhpcywgZWxlbWVudCwgc3VibWl0dGVyKTtcbiAgICAgICAgaWYgKHRoaXMuZm9ybVN1Ym1pc3Npb24uZmV0Y2hSZXF1ZXN0LmlzSWRlbXBvdGVudCkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZUZyYW1lKGVsZW1lbnQsIHRoaXMuZm9ybVN1Ym1pc3Npb24uZmV0Y2hSZXF1ZXN0LnVybC5ocmVmKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZmV0Y2hSZXF1ZXN0IH0gPSB0aGlzLmZvcm1TdWJtaXNzaW9uO1xuICAgICAgICAgICAgdGhpcy5wcmVwYXJlSGVhZGVyc0ZvclJlcXVlc3QoZmV0Y2hSZXF1ZXN0LmhlYWRlcnMsIGZldGNoUmVxdWVzdCk7XG4gICAgICAgICAgICB0aGlzLmZvcm1TdWJtaXNzaW9uLnN0YXJ0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJlcGFyZUhlYWRlcnNGb3JSZXF1ZXN0KGhlYWRlcnMsIHJlcXVlc3QpIHtcbiAgICAgICAgaGVhZGVyc1tcIlR1cmJvLUZyYW1lXCJdID0gdGhpcy5pZDtcbiAgICB9XG4gICAgcmVxdWVzdFN0YXJ0ZWQocmVxdWVzdCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKFwiYnVzeVwiLCBcIlwiKTtcbiAgICB9XG4gICAgcmVxdWVzdFByZXZlbnRlZEhhbmRsaW5nUmVzcG9uc2UocmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5yZXNvbHZlVmlzaXRQcm9taXNlKCk7XG4gICAgfVxuICAgIGFzeW5jIHJlcXVlc3RTdWNjZWVkZWRXaXRoUmVzcG9uc2UocmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLnJlc29sdmVWaXNpdFByb21pc2UoKTtcbiAgICB9XG4gICAgcmVxdWVzdEZhaWxlZFdpdGhSZXNwb25zZShyZXF1ZXN0LCByZXNwb25zZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5yZXNvbHZlVmlzaXRQcm9taXNlKCk7XG4gICAgfVxuICAgIHJlcXVlc3RFcnJvcmVkKHJlcXVlc3QsIGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB0aGlzLnJlc29sdmVWaXNpdFByb21pc2UoKTtcbiAgICB9XG4gICAgcmVxdWVzdEZpbmlzaGVkKHJlcXVlc3QpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShcImJ1c3lcIik7XG4gICAgfVxuICAgIGZvcm1TdWJtaXNzaW9uU3RhcnRlZChmb3JtU3VibWlzc2lvbikge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZmluZEZyYW1lRWxlbWVudChmb3JtU3VibWlzc2lvbi5mb3JtRWxlbWVudCk7XG4gICAgICAgIGZyYW1lLnNldEF0dHJpYnV0ZShcImJ1c3lcIiwgXCJcIik7XG4gICAgfVxuICAgIGZvcm1TdWJtaXNzaW9uU3VjY2VlZGVkV2l0aFJlc3BvbnNlKGZvcm1TdWJtaXNzaW9uLCByZXNwb25zZSkge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZmluZEZyYW1lRWxlbWVudChmb3JtU3VibWlzc2lvbi5mb3JtRWxlbWVudCk7XG4gICAgICAgIGZyYW1lLmRlbGVnYXRlLmxvYWRSZXNwb25zZShyZXNwb25zZSk7XG4gICAgfVxuICAgIGZvcm1TdWJtaXNzaW9uRmFpbGVkV2l0aFJlc3BvbnNlKGZvcm1TdWJtaXNzaW9uLCBmZXRjaFJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5kZWxlZ2F0ZS5sb2FkUmVzcG9uc2UoZmV0Y2hSZXNwb25zZSk7XG4gICAgfVxuICAgIGZvcm1TdWJtaXNzaW9uRXJyb3JlZChmb3JtU3VibWlzc2lvbiwgZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICAgIGZvcm1TdWJtaXNzaW9uRmluaXNoZWQoZm9ybVN1Ym1pc3Npb24pIHtcbiAgICAgICAgY29uc3QgZnJhbWUgPSB0aGlzLmZpbmRGcmFtZUVsZW1lbnQoZm9ybVN1Ym1pc3Npb24uZm9ybUVsZW1lbnQpO1xuICAgICAgICBmcmFtZS5yZW1vdmVBdHRyaWJ1dGUoXCJidXN5XCIpO1xuICAgIH1cbiAgICBhbGxvd3NJbW1lZGlhdGVSZW5kZXIoc25hcHNob3QsIHJlc3VtZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdmlld1JlbmRlcmVkU25hcHNob3Qoc25hcHNob3QsIGlzUHJldmlldykge1xuICAgIH1cbiAgICB2aWV3SW52YWxpZGF0ZWQoKSB7XG4gICAgfVxuICAgIGFzeW5jIHZpc2l0KHVybCkge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IEZldGNoUmVxdWVzdCh0aGlzLCBGZXRjaE1ldGhvZC5nZXQsIGV4cGFuZFVSTCh1cmwpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlVmlzaXRQcm9taXNlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZVZpc2l0UHJvbWlzZSA9ICgpID0+IHsgfTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVxdWVzdC5wZXJmb3JtKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBuYXZpZ2F0ZUZyYW1lKGVsZW1lbnQsIHVybCkge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZmluZEZyYW1lRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgZnJhbWUuc3JjID0gdXJsO1xuICAgIH1cbiAgICBmaW5kRnJhbWVFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS10dXJiby1mcmFtZVwiKSB8fCB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpO1xuICAgICAgICByZXR1cm4gKF9hID0gZ2V0RnJhbWVFbGVtZW50QnlJZChpZCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuZWxlbWVudDtcbiAgICB9XG4gICAgYXN5bmMgZXh0cmFjdEZvcmVpZ25GcmFtZUVsZW1lbnQoY29udGFpbmVyKSB7XG4gICAgICAgIGxldCBlbGVtZW50O1xuICAgICAgICBjb25zdCBpZCA9IENTUy5lc2NhcGUodGhpcy5pZCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudCA9IGFjdGl2YXRlRWxlbWVudChjb250YWluZXIucXVlcnlTZWxlY3RvcihgdHVyYm8tZnJhbWUjJHtpZH1gKSwgdGhpcy5jdXJyZW50VVJMKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVsZW1lbnQgPSBhY3RpdmF0ZUVsZW1lbnQoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYHR1cmJvLWZyYW1lW3NyY11bcmVjdXJzZX49JHtpZH1dYCksIHRoaXMuY3VycmVudFVSTCkpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBlbGVtZW50LmxvYWRlZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5leHRyYWN0Rm9yZWlnbkZyYW1lRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFJlc3BvbnNlIGhhcyBubyBtYXRjaGluZyA8dHVyYm8tZnJhbWUgaWQ9XCIke2lkfVwiPiBlbGVtZW50YCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEZyYW1lRWxlbWVudCgpO1xuICAgIH1cbiAgICBzaG91bGRJbnRlcmNlcHROYXZpZ2F0aW9uKGVsZW1lbnQsIHN1Ym1pdHRlcikge1xuICAgICAgICBjb25zdCBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS10dXJiby1mcmFtZVwiKSB8fCB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpO1xuICAgICAgICBpZiAoIXRoaXMuZW5hYmxlZCB8fCBpZCA9PSBcIl90b3BcIikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgY29uc3QgZnJhbWVFbGVtZW50ID0gZ2V0RnJhbWVFbGVtZW50QnlJZChpZCk7XG4gICAgICAgICAgICBpZiAoZnJhbWVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFmcmFtZUVsZW1lbnQuZGlzYWJsZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZXNzaW9uLmVsZW1lbnREcml2ZUVuYWJsZWQoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VibWl0dGVyICYmICFzZXNzaW9uLmVsZW1lbnREcml2ZUVuYWJsZWQoc3VibWl0dGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuaWQ7XG4gICAgfVxuICAgIGdldCBlbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuZWxlbWVudC5kaXNhYmxlZDtcbiAgICB9XG4gICAgZ2V0IHNvdXJjZVVSTCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5zcmMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuc3JjO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCByZWxvYWRhYmxlKCkge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZmluZEZyYW1lRWxlbWVudCh0aGlzLmVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gZnJhbWUuaGFzQXR0cmlidXRlKFwicmVsb2FkYWJsZVwiKTtcbiAgICB9XG4gICAgc2V0IHJlbG9hZGFibGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgZnJhbWUgPSB0aGlzLmZpbmRGcmFtZUVsZW1lbnQodGhpcy5lbGVtZW50KTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBmcmFtZS5zZXRBdHRyaWJ1dGUoXCJyZWxvYWRhYmxlXCIsIFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZnJhbWUucmVtb3ZlQXR0cmlidXRlKFwicmVsb2FkYWJsZVwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXQgc291cmNlVVJMKHNvdXJjZVVSTCkge1xuICAgICAgICB0aGlzLnNldHRpbmdTb3VyY2VVUkwgPSB0cnVlO1xuICAgICAgICB0aGlzLmVsZW1lbnQuc3JjID0gc291cmNlVVJMICE9PSBudWxsICYmIHNvdXJjZVVSTCAhPT0gdm9pZCAwID8gc291cmNlVVJMIDogbnVsbDtcbiAgICAgICAgdGhpcy5jdXJyZW50VVJMID0gdGhpcy5lbGVtZW50LnNyYztcbiAgICAgICAgdGhpcy5zZXR0aW5nU291cmNlVVJMID0gZmFsc2U7XG4gICAgfVxuICAgIGdldCBsb2FkaW5nU3R5bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQubG9hZGluZztcbiAgICB9XG4gICAgZ2V0IGlzTG9hZGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybVN1Ym1pc3Npb24gIT09IHVuZGVmaW5lZCB8fCB0aGlzLnJlc29sdmVWaXNpdFByb21pc2UoKSAhPT0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXQgaXNBY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuaXNBY3RpdmUgJiYgdGhpcy5jb25uZWN0ZWQ7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0RnJhbWVFbGVtZW50QnlJZChpZCkge1xuICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRnJhbWVFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGFjdGl2YXRlRWxlbWVudChlbGVtZW50LCBjdXJyZW50VVJMKSB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3Qgc3JjID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJzcmNcIik7XG4gICAgICAgIGlmIChzcmMgIT0gbnVsbCAmJiBjdXJyZW50VVJMICE9IG51bGwgJiYgdXJsc0FyZUVxdWFsKHNyYywgY3VycmVudFVSTCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWF0Y2hpbmcgPHR1cmJvLWZyYW1lIGlkPVwiJHtlbGVtZW50LmlkfVwiPiBlbGVtZW50IGhhcyBhIHNvdXJjZSBVUkwgd2hpY2ggcmVmZXJlbmNlcyBpdHNlbGZgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudC5vd25lckRvY3VtZW50ICE9PSBkb2N1bWVudCkge1xuICAgICAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmltcG9ydE5vZGUoZWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBGcmFtZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBTdHJlYW1BY3Rpb25zID0ge1xuICAgIGFmdGVyKCkge1xuICAgICAgICB0aGlzLnRhcmdldEVsZW1lbnRzLmZvckVhY2goZSA9PiB7IHZhciBfYTsgcmV0dXJuIChfYSA9IGUucGFyZW50RWxlbWVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmluc2VydEJlZm9yZSh0aGlzLnRlbXBsYXRlQ29udGVudCwgZS5uZXh0U2libGluZyk7IH0pO1xuICAgIH0sXG4gICAgYXBwZW5kKCkge1xuICAgICAgICB0aGlzLnJlbW92ZUR1cGxpY2F0ZVRhcmdldENoaWxkcmVuKCk7XG4gICAgICAgIHRoaXMudGFyZ2V0RWxlbWVudHMuZm9yRWFjaChlID0+IGUuYXBwZW5kKHRoaXMudGVtcGxhdGVDb250ZW50KSk7XG4gICAgfSxcbiAgICBiZWZvcmUoKSB7XG4gICAgICAgIHRoaXMudGFyZ2V0RWxlbWVudHMuZm9yRWFjaChlID0+IHsgdmFyIF9hOyByZXR1cm4gKF9hID0gZS5wYXJlbnRFbGVtZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaW5zZXJ0QmVmb3JlKHRoaXMudGVtcGxhdGVDb250ZW50LCBlKTsgfSk7XG4gICAgfSxcbiAgICBwcmVwZW5kKCkge1xuICAgICAgICB0aGlzLnJlbW92ZUR1cGxpY2F0ZVRhcmdldENoaWxkcmVuKCk7XG4gICAgICAgIHRoaXMudGFyZ2V0RWxlbWVudHMuZm9yRWFjaChlID0+IGUucHJlcGVuZCh0aGlzLnRlbXBsYXRlQ29udGVudCkpO1xuICAgIH0sXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICB0aGlzLnRhcmdldEVsZW1lbnRzLmZvckVhY2goZSA9PiBlLnJlbW92ZSgpKTtcbiAgICB9LFxuICAgIHJlcGxhY2UoKSB7XG4gICAgICAgIHRoaXMudGFyZ2V0RWxlbWVudHMuZm9yRWFjaChlID0+IGUucmVwbGFjZVdpdGgodGhpcy50ZW1wbGF0ZUNvbnRlbnQpKTtcbiAgICB9LFxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgdGhpcy50YXJnZXRFbGVtZW50cy5mb3JFYWNoKGUgPT4ge1xuICAgICAgICAgICAgZS5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICAgICAgZS5hcHBlbmQodGhpcy50ZW1wbGF0ZUNvbnRlbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG5jbGFzcyBTdHJlYW1FbGVtZW50IGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICAgIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgcmVuZGVyKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLnJlbmRlclByb21pc2UpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICh0aGlzLnJlbmRlclByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGlzcGF0Y2hFdmVudCh0aGlzLmJlZm9yZVJlbmRlckV2ZW50KSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5leHRBbmltYXRpb25GcmFtZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMucGVyZm9ybUFjdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSgpKTtcbiAgICB9XG4gICAgZGlzY29ubmVjdCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9hKSB7IH1cbiAgICB9XG4gICAgcmVtb3ZlRHVwbGljYXRlVGFyZ2V0Q2hpbGRyZW4oKSB7XG4gICAgICAgIHRoaXMuZHVwbGljYXRlQ2hpbGRyZW4uZm9yRWFjaChjID0+IGMucmVtb3ZlKCkpO1xuICAgIH1cbiAgICBnZXQgZHVwbGljYXRlQ2hpbGRyZW4oKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdDaGlsZHJlbiA9IHRoaXMudGFyZ2V0RWxlbWVudHMuZmxhdE1hcChlID0+IFsuLi5lLmNoaWxkcmVuXSkuZmlsdGVyKGMgPT4gISFjLmlkKTtcbiAgICAgICAgY29uc3QgbmV3Q2hpbGRyZW5JZHMgPSBbLi4uKF9hID0gdGhpcy50ZW1wbGF0ZUNvbnRlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGlsZHJlbl0uZmlsdGVyKGMgPT4gISFjLmlkKS5tYXAoYyA9PiBjLmlkKTtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ2hpbGRyZW4uZmlsdGVyKGMgPT4gbmV3Q2hpbGRyZW5JZHMuaW5jbHVkZXMoYy5pZCkpO1xuICAgIH1cbiAgICBnZXQgcGVyZm9ybUFjdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb25GdW5jdGlvbiA9IFN0cmVhbUFjdGlvbnNbdGhpcy5hY3Rpb25dO1xuICAgICAgICAgICAgaWYgKGFjdGlvbkZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbkZ1bmN0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yYWlzZShcInVua25vd24gYWN0aW9uXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmFpc2UoXCJhY3Rpb24gYXR0cmlidXRlIGlzIG1pc3NpbmdcIik7XG4gICAgfVxuICAgIGdldCB0YXJnZXRFbGVtZW50cygpIHtcbiAgICAgICAgaWYgKHRoaXMudGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50YXJnZXRFbGVtZW50c0J5SWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy50YXJnZXRzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50YXJnZXRFbGVtZW50c0J5UXVlcnk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJhaXNlKFwidGFyZ2V0IG9yIHRhcmdldHMgYXR0cmlidXRlIGlzIG1pc3NpbmdcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHRlbXBsYXRlQ29udGVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVFbGVtZW50LmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpO1xuICAgIH1cbiAgICBnZXQgdGVtcGxhdGVFbGVtZW50KCkge1xuICAgICAgICBpZiAodGhpcy5maXJzdEVsZW1lbnRDaGlsZCBpbnN0YW5jZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmFpc2UoXCJmaXJzdCBjaGlsZCBlbGVtZW50IG11c3QgYmUgYSA8dGVtcGxhdGU+IGVsZW1lbnRcIik7XG4gICAgfVxuICAgIGdldCBhY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZShcImFjdGlvblwiKTtcbiAgICB9XG4gICAgZ2V0IHRhcmdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpO1xuICAgIH1cbiAgICBnZXQgdGFyZ2V0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKFwidGFyZ2V0c1wiKTtcbiAgICB9XG4gICAgcmFpc2UobWVzc2FnZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5kZXNjcmlwdGlvbn06ICR7bWVzc2FnZX1gKTtcbiAgICB9XG4gICAgZ2V0IGRlc2NyaXB0aW9uKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gKF9iID0gKChfYSA9IHRoaXMub3V0ZXJIVE1MLm1hdGNoKC88W14+XSs+LykpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdKVswXSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCI8dHVyYm8tc3RyZWFtPlwiO1xuICAgIH1cbiAgICBnZXQgYmVmb3JlUmVuZGVyRXZlbnQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3VzdG9tRXZlbnQoXCJ0dXJibzpiZWZvcmUtc3RyZWFtLXJlbmRlclwiLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgfVxuICAgIGdldCB0YXJnZXRFbGVtZW50c0J5SWQoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IChfYSA9IHRoaXMub3duZXJEb2N1bWVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmdldEVsZW1lbnRCeUlkKHRoaXMudGFyZ2V0KTtcbiAgICAgICAgaWYgKGVsZW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbZWxlbWVudF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHRhcmdldEVsZW1lbnRzQnlRdWVyeSgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IChfYSA9IHRoaXMub3duZXJEb2N1bWVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy50YXJnZXRzKTtcbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGVsZW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuRnJhbWVFbGVtZW50LmRlbGVnYXRlQ29uc3RydWN0b3IgPSBGcmFtZUNvbnRyb2xsZXI7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoXCJ0dXJiby1mcmFtZVwiLCBGcmFtZUVsZW1lbnQpO1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKFwidHVyYm8tc3RyZWFtXCIsIFN0cmVhbUVsZW1lbnQpO1xuXG4oKCkgPT4ge1xuICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdDtcbiAgICBpZiAoIWVsZW1lbnQpXG4gICAgICAgIHJldHVybjtcbiAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJkYXRhLXR1cmJvLXN1cHByZXNzLXdhcm5pbmdcIikpXG4gICAgICAgIHJldHVybjtcbiAgICB3aGlsZSAoZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudCkge1xuICAgICAgICBpZiAoZWxlbWVudCA9PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKHVuaW5kZW50IGBcbiAgICAgICAgWW91IGFyZSBsb2FkaW5nIFR1cmJvIGZyb20gYSA8c2NyaXB0PiBlbGVtZW50IGluc2lkZSB0aGUgPGJvZHk+IGVsZW1lbnQuIFRoaXMgaXMgcHJvYmFibHkgbm90IHdoYXQgeW91IG1lYW50IHRvIGRvIVxuXG4gICAgICAgIExvYWQgeW91ciBhcHBsaWNhdGlvblx1MjAxOXMgSmF2YVNjcmlwdCBidW5kbGUgaW5zaWRlIHRoZSA8aGVhZD4gZWxlbWVudCBpbnN0ZWFkLiA8c2NyaXB0PiBlbGVtZW50cyBpbiA8Ym9keT4gYXJlIGV2YWx1YXRlZCB3aXRoIGVhY2ggcGFnZSBjaGFuZ2UuXG5cbiAgICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZTogaHR0cHM6Ly90dXJiby5ob3R3aXJlZC5kZXYvaGFuZGJvb2svYnVpbGRpbmcjd29ya2luZy13aXRoLXNjcmlwdC1lbGVtZW50c1xuXG4gICAgICAgIFx1MjAxNFx1MjAxNFxuICAgICAgICBTdXBwcmVzcyB0aGlzIHdhcm5pbmcgYnkgYWRkaW5nIGEgXCJkYXRhLXR1cmJvLXN1cHByZXNzLXdhcm5pbmdcIiBhdHRyaWJ1dGUgdG86ICVzXG4gICAgICBgLCBlbGVtZW50Lm91dGVySFRNTCk7XG4gICAgICAgIH1cbiAgICB9XG59KSgpO1xuXG53aW5kb3cuVHVyYm8gPSBUdXJibztcbnN0YXJ0KCk7XG5cbmV4cG9ydCB7IFBhZ2VSZW5kZXJlciwgUGFnZVNuYXBzaG90LCBjbGVhckNhY2hlLCBjb25uZWN0U3RyZWFtU291cmNlLCBkaXNjb25uZWN0U3RyZWFtU291cmNlLCBuYXZpZ2F0b3IsIHJlZ2lzdGVyQWRhcHRlciwgcmVuZGVyU3RyZWFtTWVzc2FnZSwgc2Vzc2lvbiwgc2V0UHJvZ3Jlc3NCYXJEZWxheSwgc3RhcnQsIHZpc2l0IH07XG4iLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiaW1wb3J0IHsgQ29udHJvbGxlciB9IGZyb20gXCJzdGltdWx1c1wiO1xuaW1wb3J0IHsgRGF0ZVRpbWUgfSBmcm9tIFwibHV4b25cIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBDb250cm9sbGVyIHtcbiAgc3RhdGljIHZhbHVlcyA9IHsgZm9ybWF0OiBTdHJpbmcgfTtcblxuICBjb25uZWN0KCkge1xuICAgIHZhciBicm93c2VyVHogPSBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmU7XG4gICAgdmFyIGJyb3dzZXJMb2NhbGUgPSBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlO1xuICAgIHZhciBsb2NhbGUgPSBkb2N1bWVudC5ib2R5LmRhdGFzZXQubG9jYWxlIHx8IGJyb3dzZXJMb2NhbGUgfHwgXCJlblwiO1xuICAgIHZhciB0eiA9IGRvY3VtZW50LmJvZHkuZGF0YXNldC50eiB8fCBicm93c2VyVHogfHwgXCJVVENcIjtcbiAgICB2YXIgc3R5bGUgPSBEYXRlVGltZVt0aGlzLmZvcm1hdFZhbHVlXTtcbiAgICBjb25zb2xlLmxvZyhsb2NhbGUsdHosc3R5bGUpO1xuICAgIHRoaXMuZGF0ZSA9IERhdGVUaW1lLmZyb21JU08odGhpcy5lbGVtZW50LmRhdGVUaW1lKS5zZXRab25lKHR6KS5zZXRMb2NhbGUobG9jYWxlKTtcbiAgICB0aGlzLmVsZW1lbnQuaW5uZXJUZXh0ID0gdGhpcy5kYXRlLnRvTG9jYWxlU3RyaW5nKHN0eWxlKTtcbiAgfVxuXG59XG5cbiIsICJpbXBvcnQgYzAgZnJvbSAnLi90aW1lX2NvbnRyb2xsZXInO1xuZXhwb3J0IGNvbnN0IGRlZmluaXRpb25zID0gW1xuXHR7aWRlbnRpZmllcjogJ3RpbWUnLCBjb250cm9sbGVyQ29uc3RydWN0b3I6IGMwfSxcbl07XG4iLCAiLy8gd3JhcHMgdmFsdWUgaW4gY2xvc3VyZSBvciByZXR1cm5zIGNsb3N1cmVcbmV4cG9ydCBsZXQgY2xvc3VyZSA9ICh2YWx1ZSkgPT4ge1xuICBpZih0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIil7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH0gZWxzZSB7XG4gICAgbGV0IGNsb3N1cmUgPSBmdW5jdGlvbiAoKXsgcmV0dXJuIHZhbHVlIH1cbiAgICByZXR1cm4gY2xvc3VyZVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IGdsb2JhbFNlbGYgPSB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiBudWxsXG5leHBvcnQgY29uc3QgcGh4V2luZG93ID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IG51bGxcbmV4cG9ydCBjb25zdCBnbG9iYWwgPSBnbG9iYWxTZWxmIHx8IHBoeFdpbmRvdyB8fCB0aGlzXG5leHBvcnQgY29uc3QgREVGQVVMVF9WU04gPSBcIjIuMC4wXCJcbmV4cG9ydCBjb25zdCBTT0NLRVRfU1RBVEVTID0ge2Nvbm5lY3Rpbmc6IDAsIG9wZW46IDEsIGNsb3Npbmc6IDIsIGNsb3NlZDogM31cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJTUVPVVQgPSAxMDAwMFxuZXhwb3J0IGNvbnN0IFdTX0NMT1NFX05PUk1BTCA9IDEwMDBcbmV4cG9ydCBjb25zdCBDSEFOTkVMX1NUQVRFUyA9IHtcbiAgY2xvc2VkOiBcImNsb3NlZFwiLFxuICBlcnJvcmVkOiBcImVycm9yZWRcIixcbiAgam9pbmVkOiBcImpvaW5lZFwiLFxuICBqb2luaW5nOiBcImpvaW5pbmdcIixcbiAgbGVhdmluZzogXCJsZWF2aW5nXCIsXG59XG5leHBvcnQgY29uc3QgQ0hBTk5FTF9FVkVOVFMgPSB7XG4gIGNsb3NlOiBcInBoeF9jbG9zZVwiLFxuICBlcnJvcjogXCJwaHhfZXJyb3JcIixcbiAgam9pbjogXCJwaHhfam9pblwiLFxuICByZXBseTogXCJwaHhfcmVwbHlcIixcbiAgbGVhdmU6IFwicGh4X2xlYXZlXCJcbn1cbmV4cG9ydCBjb25zdCBDSEFOTkVMX0xJRkVDWUNMRV9FVkVOVFMgPSBbXG4gIENIQU5ORUxfRVZFTlRTLmNsb3NlLFxuICBDSEFOTkVMX0VWRU5UUy5lcnJvcixcbiAgQ0hBTk5FTF9FVkVOVFMuam9pbixcbiAgQ0hBTk5FTF9FVkVOVFMucmVwbHksXG4gIENIQU5ORUxfRVZFTlRTLmxlYXZlXG5dXG5leHBvcnQgY29uc3QgVFJBTlNQT1JUUyA9IHtcbiAgbG9uZ3BvbGw6IFwibG9uZ3BvbGxcIixcbiAgd2Vic29ja2V0OiBcIndlYnNvY2tldFwiXG59XG4iLCAiLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgUHVzaFxuICogQHBhcmFtIHtDaGFubmVsfSBjaGFubmVsIC0gVGhlIENoYW5uZWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIFRoZSBldmVudCwgZm9yIGV4YW1wbGUgYFwicGh4X2pvaW5cImBcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkIC0gVGhlIHBheWxvYWQsIGZvciBleGFtcGxlIGB7dXNlcl9pZDogMTIzfWBcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IC0gVGhlIHB1c2ggdGltZW91dCBpbiBtaWxsaXNlY29uZHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHVzaCB7XG4gIGNvbnN0cnVjdG9yKGNoYW5uZWwsIGV2ZW50LCBwYXlsb2FkLCB0aW1lb3V0KXtcbiAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsXG4gICAgdGhpcy5ldmVudCA9IGV2ZW50XG4gICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZCB8fCBmdW5jdGlvbiAoKXsgcmV0dXJuIHt9IH1cbiAgICB0aGlzLnJlY2VpdmVkUmVzcCA9IG51bGxcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgdGhpcy50aW1lb3V0VGltZXIgPSBudWxsXG4gICAgdGhpcy5yZWNIb29rcyA9IFtdXG4gICAgdGhpcy5zZW50ID0gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZW91dFxuICAgKi9cbiAgcmVzZW5kKHRpbWVvdXQpe1xuICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXRcbiAgICB0aGlzLnJlc2V0KClcbiAgICB0aGlzLnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBzZW5kKCl7XG4gICAgaWYodGhpcy5oYXNSZWNlaXZlZChcInRpbWVvdXRcIikpeyByZXR1cm4gfVxuICAgIHRoaXMuc3RhcnRUaW1lb3V0KClcbiAgICB0aGlzLnNlbnQgPSB0cnVlXG4gICAgdGhpcy5jaGFubmVsLnNvY2tldC5wdXNoKHtcbiAgICAgIHRvcGljOiB0aGlzLmNoYW5uZWwudG9waWMsXG4gICAgICBldmVudDogdGhpcy5ldmVudCxcbiAgICAgIHBheWxvYWQ6IHRoaXMucGF5bG9hZCgpLFxuICAgICAgcmVmOiB0aGlzLnJlZixcbiAgICAgIGpvaW5fcmVmOiB0aGlzLmNoYW5uZWwuam9pblJlZigpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHN0YXR1c1xuICAgKiBAcGFyYW0geyp9IGNhbGxiYWNrXG4gICAqL1xuICByZWNlaXZlKHN0YXR1cywgY2FsbGJhY2spe1xuICAgIGlmKHRoaXMuaGFzUmVjZWl2ZWQoc3RhdHVzKSl7XG4gICAgICBjYWxsYmFjayh0aGlzLnJlY2VpdmVkUmVzcC5yZXNwb25zZSlcbiAgICB9XG5cbiAgICB0aGlzLnJlY0hvb2tzLnB1c2goe3N0YXR1cywgY2FsbGJhY2t9KVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlc2V0KCl7XG4gICAgdGhpcy5jYW5jZWxSZWZFdmVudCgpXG4gICAgdGhpcy5yZWYgPSBudWxsXG4gICAgdGhpcy5yZWZFdmVudCA9IG51bGxcbiAgICB0aGlzLnJlY2VpdmVkUmVzcCA9IG51bGxcbiAgICB0aGlzLnNlbnQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBtYXRjaFJlY2VpdmUoe3N0YXR1cywgcmVzcG9uc2UsIF9yZWZ9KXtcbiAgICB0aGlzLnJlY0hvb2tzLmZpbHRlcihoID0+IGguc3RhdHVzID09PSBzdGF0dXMpXG4gICAgICAuZm9yRWFjaChoID0+IGguY2FsbGJhY2socmVzcG9uc2UpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjYW5jZWxSZWZFdmVudCgpe1xuICAgIGlmKCF0aGlzLnJlZkV2ZW50KXsgcmV0dXJuIH1cbiAgICB0aGlzLmNoYW5uZWwub2ZmKHRoaXMucmVmRXZlbnQpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNhbmNlbFRpbWVvdXQoKXtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0VGltZXIpXG4gICAgdGhpcy50aW1lb3V0VGltZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0YXJ0VGltZW91dCgpe1xuICAgIGlmKHRoaXMudGltZW91dFRpbWVyKXsgdGhpcy5jYW5jZWxUaW1lb3V0KCkgfVxuICAgIHRoaXMucmVmID0gdGhpcy5jaGFubmVsLnNvY2tldC5tYWtlUmVmKClcbiAgICB0aGlzLnJlZkV2ZW50ID0gdGhpcy5jaGFubmVsLnJlcGx5RXZlbnROYW1lKHRoaXMucmVmKVxuXG4gICAgdGhpcy5jaGFubmVsLm9uKHRoaXMucmVmRXZlbnQsIHBheWxvYWQgPT4ge1xuICAgICAgdGhpcy5jYW5jZWxSZWZFdmVudCgpXG4gICAgICB0aGlzLmNhbmNlbFRpbWVvdXQoKVxuICAgICAgdGhpcy5yZWNlaXZlZFJlc3AgPSBwYXlsb2FkXG4gICAgICB0aGlzLm1hdGNoUmVjZWl2ZShwYXlsb2FkKVxuICAgIH0pXG5cbiAgICB0aGlzLnRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50cmlnZ2VyKFwidGltZW91dFwiLCB7fSlcbiAgICB9LCB0aGlzLnRpbWVvdXQpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGhhc1JlY2VpdmVkKHN0YXR1cyl7XG4gICAgcmV0dXJuIHRoaXMucmVjZWl2ZWRSZXNwICYmIHRoaXMucmVjZWl2ZWRSZXNwLnN0YXR1cyA9PT0gc3RhdHVzXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRyaWdnZXIoc3RhdHVzLCByZXNwb25zZSl7XG4gICAgdGhpcy5jaGFubmVsLnRyaWdnZXIodGhpcy5yZWZFdmVudCwge3N0YXR1cywgcmVzcG9uc2V9KVxuICB9XG59XG4iLCAiLyoqXG4gKlxuICogQ3JlYXRlcyBhIHRpbWVyIHRoYXQgYWNjZXB0cyBhIGB0aW1lckNhbGNgIGZ1bmN0aW9uIHRvIHBlcmZvcm1cbiAqIGNhbGN1bGF0ZWQgdGltZW91dCByZXRyaWVzLCBzdWNoIGFzIGV4cG9uZW50aWFsIGJhY2tvZmYuXG4gKlxuICogQGV4YW1wbGVcbiAqIGxldCByZWNvbm5lY3RUaW1lciA9IG5ldyBUaW1lcigoKSA9PiB0aGlzLmNvbm5lY3QoKSwgZnVuY3Rpb24odHJpZXMpe1xuICogICByZXR1cm4gWzEwMDAsIDUwMDAsIDEwMDAwXVt0cmllcyAtIDFdIHx8IDEwMDAwXG4gKiB9KVxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgMTAwMFxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgNTAwMFxuICogcmVjb25uZWN0VGltZXIucmVzZXQoKVxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgMTAwMFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aW1lckNhbGNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGltZXIge1xuICBjb25zdHJ1Y3RvcihjYWxsYmFjaywgdGltZXJDYWxjKXtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2tcbiAgICB0aGlzLnRpbWVyQ2FsYyA9IHRpbWVyQ2FsY1xuICAgIHRoaXMudGltZXIgPSBudWxsXG4gICAgdGhpcy50cmllcyA9IDBcbiAgfVxuXG4gIHJlc2V0KCl7XG4gICAgdGhpcy50cmllcyA9IDBcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcilcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWxzIGFueSBwcmV2aW91cyBzY2hlZHVsZVRpbWVvdXQgYW5kIHNjaGVkdWxlcyBjYWxsYmFja1xuICAgKi9cbiAgc2NoZWR1bGVUaW1lb3V0KCl7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpXG5cbiAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnRyaWVzID0gdGhpcy50cmllcyArIDFcbiAgICAgIHRoaXMuY2FsbGJhY2soKVxuICAgIH0sIHRoaXMudGltZXJDYWxjKHRoaXMudHJpZXMgKyAxKSlcbiAgfVxufVxuIiwgImltcG9ydCB7Y2xvc3VyZX0gZnJvbSBcIi4vdXRpbHNcIlxuaW1wb3J0IHtcbiAgQ0hBTk5FTF9FVkVOVFMsXG4gIENIQU5ORUxfTElGRUNZQ0xFX0VWRU5UUyxcbiAgQ0hBTk5FTF9TVEFURVMsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCBQdXNoIGZyb20gXCIuL3B1c2hcIlxuaW1wb3J0IFRpbWVyIGZyb20gXCIuL3RpbWVyXCJcblxuLyoqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRvcGljXG4gKiBAcGFyYW0geyhPYmplY3R8ZnVuY3Rpb24pfSBwYXJhbXNcbiAqIEBwYXJhbSB7U29ja2V0fSBzb2NrZXRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2hhbm5lbCB7XG4gIGNvbnN0cnVjdG9yKHRvcGljLCBwYXJhbXMsIHNvY2tldCl7XG4gICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmNsb3NlZFxuICAgIHRoaXMudG9waWMgPSB0b3BpY1xuICAgIHRoaXMucGFyYW1zID0gY2xvc3VyZShwYXJhbXMgfHwge30pXG4gICAgdGhpcy5zb2NrZXQgPSBzb2NrZXRcbiAgICB0aGlzLmJpbmRpbmdzID0gW11cbiAgICB0aGlzLmJpbmRpbmdSZWYgPSAwXG4gICAgdGhpcy50aW1lb3V0ID0gdGhpcy5zb2NrZXQudGltZW91dFxuICAgIHRoaXMuam9pbmVkT25jZSA9IGZhbHNlXG4gICAgdGhpcy5qb2luUHVzaCA9IG5ldyBQdXNoKHRoaXMsIENIQU5ORUxfRVZFTlRTLmpvaW4sIHRoaXMucGFyYW1zLCB0aGlzLnRpbWVvdXQpXG4gICAgdGhpcy5wdXNoQnVmZmVyID0gW11cbiAgICB0aGlzLnN0YXRlQ2hhbmdlUmVmcyA9IFtdXG5cbiAgICB0aGlzLnJlam9pblRpbWVyID0gbmV3IFRpbWVyKCgpID0+IHtcbiAgICAgIGlmKHRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkpeyB0aGlzLnJlam9pbigpIH1cbiAgICB9LCB0aGlzLnNvY2tldC5yZWpvaW5BZnRlck1zKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VSZWZzLnB1c2godGhpcy5zb2NrZXQub25FcnJvcigoKSA9PiB0aGlzLnJlam9pblRpbWVyLnJlc2V0KCkpKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VSZWZzLnB1c2godGhpcy5zb2NrZXQub25PcGVuKCgpID0+IHtcbiAgICAgIHRoaXMucmVqb2luVGltZXIucmVzZXQoKVxuICAgICAgaWYodGhpcy5pc0Vycm9yZWQoKSl7IHRoaXMucmVqb2luKCkgfVxuICAgIH0pXG4gICAgKVxuICAgIHRoaXMuam9pblB1c2gucmVjZWl2ZShcIm9rXCIsICgpID0+IHtcbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5qb2luZWRcbiAgICAgIHRoaXMucmVqb2luVGltZXIucmVzZXQoKVxuICAgICAgdGhpcy5wdXNoQnVmZmVyLmZvckVhY2gocHVzaEV2ZW50ID0+IHB1c2hFdmVudC5zZW5kKCkpXG4gICAgICB0aGlzLnB1c2hCdWZmZXIgPSBbXVxuICAgIH0pXG4gICAgdGhpcy5qb2luUHVzaC5yZWNlaXZlKFwiZXJyb3JcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmVycm9yZWRcbiAgICAgIGlmKHRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkpeyB0aGlzLnJlam9pblRpbWVyLnNjaGVkdWxlVGltZW91dCgpIH1cbiAgICB9KVxuICAgIHRoaXMub25DbG9zZSgoKSA9PiB7XG4gICAgICB0aGlzLnJlam9pblRpbWVyLnJlc2V0KClcbiAgICAgIGlmKHRoaXMuc29ja2V0Lmhhc0xvZ2dlcigpKSB0aGlzLnNvY2tldC5sb2coXCJjaGFubmVsXCIsIGBjbG9zZSAke3RoaXMudG9waWN9ICR7dGhpcy5qb2luUmVmKCl9YClcbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5jbG9zZWRcbiAgICAgIHRoaXMuc29ja2V0LnJlbW92ZSh0aGlzKVxuICAgIH0pXG4gICAgdGhpcy5vbkVycm9yKHJlYXNvbiA9PiB7XG4gICAgICBpZih0aGlzLnNvY2tldC5oYXNMb2dnZXIoKSkgdGhpcy5zb2NrZXQubG9nKFwiY2hhbm5lbFwiLCBgZXJyb3IgJHt0aGlzLnRvcGljfWAsIHJlYXNvbilcbiAgICAgIGlmKHRoaXMuaXNKb2luaW5nKCkpeyB0aGlzLmpvaW5QdXNoLnJlc2V0KCkgfVxuICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmVycm9yZWRcbiAgICAgIGlmKHRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkpeyB0aGlzLnJlam9pblRpbWVyLnNjaGVkdWxlVGltZW91dCgpIH1cbiAgICB9KVxuICAgIHRoaXMuam9pblB1c2gucmVjZWl2ZShcInRpbWVvdXRcIiwgKCkgPT4ge1xuICAgICAgaWYodGhpcy5zb2NrZXQuaGFzTG9nZ2VyKCkpIHRoaXMuc29ja2V0LmxvZyhcImNoYW5uZWxcIiwgYHRpbWVvdXQgJHt0aGlzLnRvcGljfSAoJHt0aGlzLmpvaW5SZWYoKX0pYCwgdGhpcy5qb2luUHVzaC50aW1lb3V0KVxuICAgICAgbGV0IGxlYXZlUHVzaCA9IG5ldyBQdXNoKHRoaXMsIENIQU5ORUxfRVZFTlRTLmxlYXZlLCBjbG9zdXJlKHt9KSwgdGhpcy50aW1lb3V0KVxuICAgICAgbGVhdmVQdXNoLnNlbmQoKVxuICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmVycm9yZWRcbiAgICAgIHRoaXMuam9pblB1c2gucmVzZXQoKVxuICAgICAgaWYodGhpcy5zb2NrZXQuaXNDb25uZWN0ZWQoKSl7IHRoaXMucmVqb2luVGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgfVxuICAgIH0pXG4gICAgdGhpcy5vbihDSEFOTkVMX0VWRU5UUy5yZXBseSwgKHBheWxvYWQsIHJlZikgPT4ge1xuICAgICAgdGhpcy50cmlnZ2VyKHRoaXMucmVwbHlFdmVudE5hbWUocmVmKSwgcGF5bG9hZClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEpvaW4gdGhlIGNoYW5uZWxcbiAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aW1lb3V0XG4gICAqIEByZXR1cm5zIHtQdXNofVxuICAgKi9cbiAgam9pbih0aW1lb3V0ID0gdGhpcy50aW1lb3V0KXtcbiAgICBpZih0aGlzLmpvaW5lZE9uY2Upe1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHJpZWQgdG8gam9pbiBtdWx0aXBsZSB0aW1lcy4gJ2pvaW4nIGNhbiBvbmx5IGJlIGNhbGxlZCBhIHNpbmdsZSB0aW1lIHBlciBjaGFubmVsIGluc3RhbmNlXCIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXRcbiAgICAgIHRoaXMuam9pbmVkT25jZSA9IHRydWVcbiAgICAgIHRoaXMucmVqb2luKClcbiAgICAgIHJldHVybiB0aGlzLmpvaW5QdXNoXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhvb2sgaW50byBjaGFubmVsIGNsb3NlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbkNsb3NlKGNhbGxiYWNrKXtcbiAgICB0aGlzLm9uKENIQU5ORUxfRVZFTlRTLmNsb3NlLCBjYWxsYmFjaylcbiAgfVxuXG4gIC8qKlxuICAgKiBIb29rIGludG8gY2hhbm5lbCBlcnJvcnNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIG9uRXJyb3IoY2FsbGJhY2spe1xuICAgIHJldHVybiB0aGlzLm9uKENIQU5ORUxfRVZFTlRTLmVycm9yLCByZWFzb24gPT4gY2FsbGJhY2socmVhc29uKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIG9uIGNoYW5uZWwgZXZlbnRzXG4gICAqXG4gICAqIFN1YnNjcmlwdGlvbiByZXR1cm5zIGEgcmVmIGNvdW50ZXIsIHdoaWNoIGNhbiBiZSB1c2VkIGxhdGVyIHRvXG4gICAqIHVuc3Vic2NyaWJlIHRoZSBleGFjdCBldmVudCBsaXN0ZW5lclxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCByZWYxID0gY2hhbm5lbC5vbihcImV2ZW50XCIsIGRvX3N0dWZmKVxuICAgKiBjb25zdCByZWYyID0gY2hhbm5lbC5vbihcImV2ZW50XCIsIGRvX290aGVyX3N0dWZmKVxuICAgKiBjaGFubmVsLm9mZihcImV2ZW50XCIsIHJlZjEpXG4gICAqIC8vIFNpbmNlIHVuc3Vic2NyaXB0aW9uLCBkb19zdHVmZiB3b24ndCBmaXJlLFxuICAgKiAvLyB3aGlsZSBkb19vdGhlcl9zdHVmZiB3aWxsIGtlZXAgZmlyaW5nIG9uIHRoZSBcImV2ZW50XCJcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqIEByZXR1cm5zIHtpbnRlZ2VyfSByZWZcbiAgICovXG4gIG9uKGV2ZW50LCBjYWxsYmFjayl7XG4gICAgbGV0IHJlZiA9IHRoaXMuYmluZGluZ1JlZisrXG4gICAgdGhpcy5iaW5kaW5ncy5wdXNoKHtldmVudCwgcmVmLCBjYWxsYmFja30pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlcyBvZmYgb2YgY2hhbm5lbCBldmVudHNcbiAgICpcbiAgICogVXNlIHRoZSByZWYgcmV0dXJuZWQgZnJvbSBhIGNoYW5uZWwub24oKSB0byB1bnN1YnNjcmliZSBvbmVcbiAgICogaGFuZGxlciwgb3IgcGFzcyBub3RoaW5nIGZvciB0aGUgcmVmIHRvIHVuc3Vic2NyaWJlIGFsbFxuICAgKiBoYW5kbGVycyBmb3IgdGhlIGdpdmVuIGV2ZW50LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBVbnN1YnNjcmliZSB0aGUgZG9fc3R1ZmYgaGFuZGxlclxuICAgKiBjb25zdCByZWYxID0gY2hhbm5lbC5vbihcImV2ZW50XCIsIGRvX3N0dWZmKVxuICAgKiBjaGFubmVsLm9mZihcImV2ZW50XCIsIHJlZjEpXG4gICAqXG4gICAqIC8vIFVuc3Vic2NyaWJlIGFsbCBoYW5kbGVycyBmcm9tIGV2ZW50XG4gICAqIGNoYW5uZWwub2ZmKFwiZXZlbnRcIilcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gcmVmXG4gICAqL1xuICBvZmYoZXZlbnQsIHJlZil7XG4gICAgdGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuZmlsdGVyKChiaW5kKSA9PiB7XG4gICAgICByZXR1cm4gIShiaW5kLmV2ZW50ID09PSBldmVudCAmJiAodHlwZW9mIHJlZiA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWYgPT09IGJpbmQucmVmKSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjYW5QdXNoKCl7IHJldHVybiB0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpICYmIHRoaXMuaXNKb2luZWQoKSB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgbWVzc2FnZSBgZXZlbnRgIHRvIHBob2VuaXggd2l0aCB0aGUgcGF5bG9hZCBgcGF5bG9hZGAuXG4gICAqIFBob2VuaXggcmVjZWl2ZXMgdGhpcyBpbiB0aGUgYGhhbmRsZV9pbihldmVudCwgcGF5bG9hZCwgc29ja2V0KWBcbiAgICogZnVuY3Rpb24uIGlmIHBob2VuaXggcmVwbGllcyBvciBpdCB0aW1lcyBvdXQgKGRlZmF1bHQgMTAwMDBtcyksXG4gICAqIHRoZW4gb3B0aW9uYWxseSB0aGUgcmVwbHkgY2FuIGJlIHJlY2VpdmVkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjaGFubmVsLnB1c2goXCJldmVudFwiKVxuICAgKiAgIC5yZWNlaXZlKFwib2tcIiwgcGF5bG9hZCA9PiBjb25zb2xlLmxvZyhcInBob2VuaXggcmVwbGllZDpcIiwgcGF5bG9hZCkpXG4gICAqICAgLnJlY2VpdmUoXCJlcnJvclwiLCBlcnIgPT4gY29uc29sZS5sb2coXCJwaG9lbml4IGVycm9yZWRcIiwgZXJyKSlcbiAgICogICAucmVjZWl2ZShcInRpbWVvdXRcIiwgKCkgPT4gY29uc29sZS5sb2coXCJ0aW1lZCBvdXQgcHVzaGluZ1wiKSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICogQHJldHVybnMge1B1c2h9XG4gICAqL1xuICBwdXNoKGV2ZW50LCBwYXlsb2FkLCB0aW1lb3V0ID0gdGhpcy50aW1lb3V0KXtcbiAgICBwYXlsb2FkID0gcGF5bG9hZCB8fCB7fVxuICAgIGlmKCF0aGlzLmpvaW5lZE9uY2Upe1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB0cmllZCB0byBwdXNoICcke2V2ZW50fScgdG8gJyR7dGhpcy50b3BpY30nIGJlZm9yZSBqb2luaW5nLiBVc2UgY2hhbm5lbC5qb2luKCkgYmVmb3JlIHB1c2hpbmcgZXZlbnRzYClcbiAgICB9XG4gICAgbGV0IHB1c2hFdmVudCA9IG5ldyBQdXNoKHRoaXMsIGV2ZW50LCBmdW5jdGlvbiAoKXsgcmV0dXJuIHBheWxvYWQgfSwgdGltZW91dClcbiAgICBpZih0aGlzLmNhblB1c2goKSl7XG4gICAgICBwdXNoRXZlbnQuc2VuZCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHB1c2hFdmVudC5zdGFydFRpbWVvdXQoKVxuICAgICAgdGhpcy5wdXNoQnVmZmVyLnB1c2gocHVzaEV2ZW50KVxuICAgIH1cblxuICAgIHJldHVybiBwdXNoRXZlbnRcbiAgfVxuXG4gIC8qKiBMZWF2ZXMgdGhlIGNoYW5uZWxcbiAgICpcbiAgICogVW5zdWJzY3JpYmVzIGZyb20gc2VydmVyIGV2ZW50cywgYW5kXG4gICAqIGluc3RydWN0cyBjaGFubmVsIHRvIHRlcm1pbmF0ZSBvbiBzZXJ2ZXJcbiAgICpcbiAgICogVHJpZ2dlcnMgb25DbG9zZSgpIGhvb2tzXG4gICAqXG4gICAqIFRvIHJlY2VpdmUgbGVhdmUgYWNrbm93bGVkZ2VtZW50cywgdXNlIHRoZSBgcmVjZWl2ZWBcbiAgICogaG9vayB0byBiaW5kIHRvIHRoZSBzZXJ2ZXIgYWNrLCBpZTpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY2hhbm5lbC5sZWF2ZSgpLnJlY2VpdmUoXCJva1wiLCAoKSA9PiBhbGVydChcImxlZnQhXCIpIClcbiAgICpcbiAgICogQHBhcmFtIHtpbnRlZ2VyfSB0aW1lb3V0XG4gICAqIEByZXR1cm5zIHtQdXNofVxuICAgKi9cbiAgbGVhdmUodGltZW91dCA9IHRoaXMudGltZW91dCl7XG4gICAgdGhpcy5yZWpvaW5UaW1lci5yZXNldCgpXG4gICAgdGhpcy5qb2luUHVzaC5jYW5jZWxUaW1lb3V0KClcblxuICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5sZWF2aW5nXG4gICAgbGV0IG9uQ2xvc2UgPSAoKSA9PiB7XG4gICAgICBpZih0aGlzLnNvY2tldC5oYXNMb2dnZXIoKSkgdGhpcy5zb2NrZXQubG9nKFwiY2hhbm5lbFwiLCBgbGVhdmUgJHt0aGlzLnRvcGljfWApXG4gICAgICB0aGlzLnRyaWdnZXIoQ0hBTk5FTF9FVkVOVFMuY2xvc2UsIFwibGVhdmVcIilcbiAgICB9XG4gICAgbGV0IGxlYXZlUHVzaCA9IG5ldyBQdXNoKHRoaXMsIENIQU5ORUxfRVZFTlRTLmxlYXZlLCBjbG9zdXJlKHt9KSwgdGltZW91dClcbiAgICBsZWF2ZVB1c2gucmVjZWl2ZShcIm9rXCIsICgpID0+IG9uQ2xvc2UoKSlcbiAgICAgIC5yZWNlaXZlKFwidGltZW91dFwiLCAoKSA9PiBvbkNsb3NlKCkpXG4gICAgbGVhdmVQdXNoLnNlbmQoKVxuICAgIGlmKCF0aGlzLmNhblB1c2goKSl7IGxlYXZlUHVzaC50cmlnZ2VyKFwib2tcIiwge30pIH1cblxuICAgIHJldHVybiBsZWF2ZVB1c2hcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkYWJsZSBtZXNzYWdlIGhvb2tcbiAgICpcbiAgICogUmVjZWl2ZXMgYWxsIGV2ZW50cyBmb3Igc3BlY2lhbGl6ZWQgbWVzc2FnZSBoYW5kbGluZ1xuICAgKiBiZWZvcmUgZGlzcGF0Y2hpbmcgdG8gdGhlIGNoYW5uZWwgY2FsbGJhY2tzLlxuICAgKlxuICAgKiBNdXN0IHJldHVybiB0aGUgcGF5bG9hZCwgbW9kaWZpZWQgb3IgdW5tb2RpZmllZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IHBheWxvYWRcbiAgICogQHBhcmFtIHtpbnRlZ2VyfSByZWZcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIG9uTWVzc2FnZShfZXZlbnQsIHBheWxvYWQsIF9yZWYpeyByZXR1cm4gcGF5bG9hZCB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0xpZmVjeWNsZUV2ZW50KGV2ZW50KXsgcmV0dXJuIENIQU5ORUxfTElGRUNZQ0xFX0VWRU5UUy5pbmRleE9mKGV2ZW50KSA+PSAwIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzTWVtYmVyKHRvcGljLCBldmVudCwgcGF5bG9hZCwgam9pblJlZil7XG4gICAgaWYodGhpcy50b3BpYyAhPT0gdG9waWMpeyByZXR1cm4gZmFsc2UgfVxuXG4gICAgaWYoam9pblJlZiAmJiBqb2luUmVmICE9PSB0aGlzLmpvaW5SZWYoKSAmJiB0aGlzLmlzTGlmZWN5Y2xlRXZlbnQoZXZlbnQpKXtcbiAgICAgIGlmKHRoaXMuc29ja2V0Lmhhc0xvZ2dlcigpKSB0aGlzLnNvY2tldC5sb2coXCJjaGFubmVsXCIsIFwiZHJvcHBpbmcgb3V0ZGF0ZWQgbWVzc2FnZVwiLCB7dG9waWMsIGV2ZW50LCBwYXlsb2FkLCBqb2luUmVmfSlcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgam9pblJlZigpeyByZXR1cm4gdGhpcy5qb2luUHVzaC5yZWYgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmVqb2luKHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpe1xuICAgIGlmKHRoaXMuaXNMZWF2aW5nKCkpeyByZXR1cm4gfVxuICAgIHRoaXMuc29ja2V0LmxlYXZlT3BlblRvcGljKHRoaXMudG9waWMpXG4gICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmpvaW5pbmdcbiAgICB0aGlzLmpvaW5QdXNoLnJlc2VuZCh0aW1lb3V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmlnZ2VyKGV2ZW50LCBwYXlsb2FkLCByZWYsIGpvaW5SZWYpe1xuICAgIGxldCBoYW5kbGVkUGF5bG9hZCA9IHRoaXMub25NZXNzYWdlKGV2ZW50LCBwYXlsb2FkLCByZWYsIGpvaW5SZWYpXG4gICAgaWYocGF5bG9hZCAmJiAhaGFuZGxlZFBheWxvYWQpeyB0aHJvdyBuZXcgRXJyb3IoXCJjaGFubmVsIG9uTWVzc2FnZSBjYWxsYmFja3MgbXVzdCByZXR1cm4gdGhlIHBheWxvYWQsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWRcIikgfVxuXG4gICAgbGV0IGV2ZW50QmluZGluZ3MgPSB0aGlzLmJpbmRpbmdzLmZpbHRlcihiaW5kID0+IGJpbmQuZXZlbnQgPT09IGV2ZW50KVxuXG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGV2ZW50QmluZGluZ3MubGVuZ3RoOyBpKyspe1xuICAgICAgbGV0IGJpbmQgPSBldmVudEJpbmRpbmdzW2ldXG4gICAgICBiaW5kLmNhbGxiYWNrKGhhbmRsZWRQYXlsb2FkLCByZWYsIGpvaW5SZWYgfHwgdGhpcy5qb2luUmVmKCkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZXBseUV2ZW50TmFtZShyZWYpeyByZXR1cm4gYGNoYW5fcmVwbHlfJHtyZWZ9YCB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0Nsb3NlZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuY2xvc2VkIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzRXJyb3JlZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuZXJyb3JlZCB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0pvaW5lZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuam9pbmVkIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzSm9pbmluZygpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuam9pbmluZyB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0xlYXZpbmcoKXsgcmV0dXJuIHRoaXMuc3RhdGUgPT09IENIQU5ORUxfU1RBVEVTLmxlYXZpbmcgfVxufVxuIiwgImltcG9ydCB7XG4gIGdsb2JhbFxufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBamF4IHtcbiAgY29uc3RydWN0b3IoKXtcbiAgICB0aGlzLnN0YXRlcyA9IHtjb21wbGV0ZTogNH1cbiAgfVxuXG4gIHN0YXRpYyByZXF1ZXN0KG1ldGhvZCwgZW5kUG9pbnQsIGFjY2VwdCwgYm9keSwgdGltZW91dCwgb250aW1lb3V0LCBjYWxsYmFjayl7XG4gICAgaWYoZ2xvYmFsLlhEb21haW5SZXF1ZXN0KXtcbiAgICAgIGxldCByZXEgPSBuZXcgZ2xvYmFsLlhEb21haW5SZXF1ZXN0KCkgLy8gSUU4LCBJRTlcbiAgICAgIHRoaXMueGRvbWFpblJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgcmVxID0gbmV3IGdsb2JhbC5YTUxIdHRwUmVxdWVzdCgpIC8vIElFNyssIEZpcmVmb3gsIENocm9tZSwgT3BlcmEsIFNhZmFyaVxuICAgICAgdGhpcy54aHJSZXF1ZXN0KHJlcSwgbWV0aG9kLCBlbmRQb2ludCwgYWNjZXB0LCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB4ZG9tYWluUmVxdWVzdChyZXEsIG1ldGhvZCwgZW5kUG9pbnQsIGJvZHksIHRpbWVvdXQsIG9udGltZW91dCwgY2FsbGJhY2spe1xuICAgIHJlcS50aW1lb3V0ID0gdGltZW91dFxuICAgIHJlcS5vcGVuKG1ldGhvZCwgZW5kUG9pbnQpXG4gICAgcmVxLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIGxldCByZXNwb25zZSA9IHRoaXMucGFyc2VKU09OKHJlcS5yZXNwb25zZVRleHQpXG4gICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhyZXNwb25zZSlcbiAgICB9XG4gICAgaWYob250aW1lb3V0KXsgcmVxLm9udGltZW91dCA9IG9udGltZW91dCB9XG5cbiAgICAvLyBXb3JrIGFyb3VuZCBidWcgaW4gSUU5IHRoYXQgcmVxdWlyZXMgYW4gYXR0YWNoZWQgb25wcm9ncmVzcyBoYW5kbGVyXG4gICAgcmVxLm9ucHJvZ3Jlc3MgPSAoKSA9PiB7IH1cblxuICAgIHJlcS5zZW5kKGJvZHkpXG4gIH1cblxuICBzdGF0aWMgeGhyUmVxdWVzdChyZXEsIG1ldGhvZCwgZW5kUG9pbnQsIGFjY2VwdCwgYm9keSwgdGltZW91dCwgb250aW1lb3V0LCBjYWxsYmFjayl7XG4gICAgcmVxLm9wZW4obWV0aG9kLCBlbmRQb2ludCwgdHJ1ZSlcbiAgICByZXEudGltZW91dCA9IHRpbWVvdXRcbiAgICByZXEuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBhY2NlcHQpXG4gICAgcmVxLm9uZXJyb3IgPSAoKSA9PiB7IGNhbGxiYWNrICYmIGNhbGxiYWNrKG51bGwpIH1cbiAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gKCkgPT4ge1xuICAgICAgaWYocmVxLnJlYWR5U3RhdGUgPT09IHRoaXMuc3RhdGVzLmNvbXBsZXRlICYmIGNhbGxiYWNrKXtcbiAgICAgICAgbGV0IHJlc3BvbnNlID0gdGhpcy5wYXJzZUpTT04ocmVxLnJlc3BvbnNlVGV4dClcbiAgICAgICAgY2FsbGJhY2socmVzcG9uc2UpXG4gICAgICB9XG4gICAgfVxuICAgIGlmKG9udGltZW91dCl7IHJlcS5vbnRpbWVvdXQgPSBvbnRpbWVvdXQgfVxuXG4gICAgcmVxLnNlbmQoYm9keSlcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZUpTT04ocmVzcCl7XG4gICAgaWYoIXJlc3AgfHwgcmVzcCA9PT0gXCJcIil7IHJldHVybiBudWxsIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXNwKVxuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgY29uc29sZSAmJiBjb25zb2xlLmxvZyhcImZhaWxlZCB0byBwYXJzZSBKU09OIHJlc3BvbnNlXCIsIHJlc3ApXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBzZXJpYWxpemUob2JqLCBwYXJlbnRLZXkpe1xuICAgIGxldCBxdWVyeVN0ciA9IFtdXG4gICAgZm9yKHZhciBrZXkgaW4gb2JqKXtcbiAgICAgIGlmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKXsgY29udGludWUgfVxuICAgICAgbGV0IHBhcmFtS2V5ID0gcGFyZW50S2V5ID8gYCR7cGFyZW50S2V5fVske2tleX1dYCA6IGtleVxuICAgICAgbGV0IHBhcmFtVmFsID0gb2JqW2tleV1cbiAgICAgIGlmKHR5cGVvZiBwYXJhbVZhbCA9PT0gXCJvYmplY3RcIil7XG4gICAgICAgIHF1ZXJ5U3RyLnB1c2godGhpcy5zZXJpYWxpemUocGFyYW1WYWwsIHBhcmFtS2V5KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5U3RyLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtS2V5KSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtVmFsKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHF1ZXJ5U3RyLmpvaW4oXCImXCIpXG4gIH1cblxuICBzdGF0aWMgYXBwZW5kUGFyYW1zKHVybCwgcGFyYW1zKXtcbiAgICBpZihPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCA9PT0gMCl7IHJldHVybiB1cmwgfVxuXG4gICAgbGV0IHByZWZpeCA9IHVybC5tYXRjaCgvXFw/LykgPyBcIiZcIiA6IFwiP1wiXG4gICAgcmV0dXJuIGAke3VybH0ke3ByZWZpeH0ke3RoaXMuc2VyaWFsaXplKHBhcmFtcyl9YFxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgU09DS0VUX1NUQVRFUyxcbiAgVFJBTlNQT1JUU1xufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQgQWpheCBmcm9tIFwiLi9hamF4XCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9uZ1BvbGwge1xuXG4gIGNvbnN0cnVjdG9yKGVuZFBvaW50KXtcbiAgICB0aGlzLmVuZFBvaW50ID0gbnVsbFxuICAgIHRoaXMudG9rZW4gPSBudWxsXG4gICAgdGhpcy5za2lwSGVhcnRiZWF0ID0gdHJ1ZVxuICAgIHRoaXMub25vcGVuID0gZnVuY3Rpb24gKCl7IH0gLy8gbm9vcFxuICAgIHRoaXMub25lcnJvciA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICB0aGlzLm9ubWVzc2FnZSA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICB0aGlzLm9uY2xvc2UgPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgdGhpcy5wb2xsRW5kcG9pbnQgPSB0aGlzLm5vcm1hbGl6ZUVuZHBvaW50KGVuZFBvaW50KVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMuY29ubmVjdGluZ1xuXG4gICAgdGhpcy5wb2xsKClcbiAgfVxuXG4gIG5vcm1hbGl6ZUVuZHBvaW50KGVuZFBvaW50KXtcbiAgICByZXR1cm4gKGVuZFBvaW50XG4gICAgICAucmVwbGFjZShcIndzOi8vXCIsIFwiaHR0cDovL1wiKVxuICAgICAgLnJlcGxhY2UoXCJ3c3M6Ly9cIiwgXCJodHRwczovL1wiKVxuICAgICAgLnJlcGxhY2UobmV3IFJlZ0V4cChcIiguKilcXC9cIiArIFRSQU5TUE9SVFMud2Vic29ja2V0KSwgXCIkMS9cIiArIFRSQU5TUE9SVFMubG9uZ3BvbGwpKVxuICB9XG5cbiAgZW5kcG9pbnRVUkwoKXtcbiAgICByZXR1cm4gQWpheC5hcHBlbmRQYXJhbXModGhpcy5wb2xsRW5kcG9pbnQsIHt0b2tlbjogdGhpcy50b2tlbn0pXG4gIH1cblxuICBjbG9zZUFuZFJldHJ5KCl7XG4gICAgdGhpcy5jbG9zZSgpXG4gICAgdGhpcy5yZWFkeVN0YXRlID0gU09DS0VUX1NUQVRFUy5jb25uZWN0aW5nXG4gIH1cblxuICBvbnRpbWVvdXQoKXtcbiAgICB0aGlzLm9uZXJyb3IoXCJ0aW1lb3V0XCIpXG4gICAgdGhpcy5jbG9zZUFuZFJldHJ5KClcbiAgfVxuXG4gIHBvbGwoKXtcbiAgICBpZighKHRoaXMucmVhZHlTdGF0ZSA9PT0gU09DS0VUX1NUQVRFUy5vcGVuIHx8IHRoaXMucmVhZHlTdGF0ZSA9PT0gU09DS0VUX1NUQVRFUy5jb25uZWN0aW5nKSl7IHJldHVybiB9XG5cbiAgICBBamF4LnJlcXVlc3QoXCJHRVRcIiwgdGhpcy5lbmRwb2ludFVSTCgpLCBcImFwcGxpY2F0aW9uL2pzb25cIiwgbnVsbCwgdGhpcy50aW1lb3V0LCB0aGlzLm9udGltZW91dC5iaW5kKHRoaXMpLCAocmVzcCkgPT4ge1xuICAgICAgaWYocmVzcCl7XG4gICAgICAgIHZhciB7c3RhdHVzLCB0b2tlbiwgbWVzc2FnZXN9ID0gcmVzcFxuICAgICAgICB0aGlzLnRva2VuID0gdG9rZW5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXR1cyA9IDBcbiAgICAgIH1cblxuICAgICAgc3dpdGNoKHN0YXR1cyl7XG4gICAgICAgIGNhc2UgMjAwOlxuICAgICAgICAgIG1lc3NhZ2VzLmZvckVhY2gobXNnID0+IHtcbiAgICAgICAgICAgIC8vIFRhc2tzIGFyZSB3aGF0IHRoaW5ncyBsaWtlIGV2ZW50IGhhbmRsZXJzLCBzZXRUaW1lb3V0IGNhbGxiYWNrcyxcbiAgICAgICAgICAgIC8vIHByb21pc2UgcmVzb2x2ZXMgYW5kIG1vcmUgYXJlIHJ1biB3aXRoaW4uXG4gICAgICAgICAgICAvLyBJbiBtb2Rlcm4gYnJvd3NlcnMsIHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IGtpbmRzIG9mIHRhc2tzLFxuICAgICAgICAgICAgLy8gbWljcm90YXNrcyBhbmQgbWFjcm90YXNrcy5cbiAgICAgICAgICAgIC8vIE1pY3JvdGFza3MgYXJlIG1haW5seSB1c2VkIGZvciBQcm9taXNlcywgd2hpbGUgbWFjcm90YXNrcyBhcmVcbiAgICAgICAgICAgIC8vIHVzZWQgZm9yIGV2ZXJ5dGhpbmcgZWxzZS5cbiAgICAgICAgICAgIC8vIE1pY3JvdGFza3MgYWx3YXlzIGhhdmUgcHJpb3JpdHkgb3ZlciBtYWNyb3Rhc2tzLiBJZiB0aGUgSlMgZW5naW5lXG4gICAgICAgICAgICAvLyBpcyBsb29raW5nIGZvciBhIHRhc2sgdG8gcnVuLCBpdCB3aWxsIGFsd2F5cyB0cnkgdG8gZW1wdHkgdGhlXG4gICAgICAgICAgICAvLyBtaWNyb3Rhc2sgcXVldWUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcnVuIGFueXRoaW5nIGZyb20gdGhlXG4gICAgICAgICAgICAvLyBtYWNyb3Rhc2sgcXVldWUuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gRm9yIHRoZSBXZWJTb2NrZXQgdHJhbnNwb3J0LCBtZXNzYWdlcyBhbHdheXMgYXJyaXZlIGluIHRoZWlyIG93blxuICAgICAgICAgICAgLy8gZXZlbnQuIFRoaXMgbWVhbnMgdGhhdCBpZiBhbnkgcHJvbWlzZXMgYXJlIHJlc29sdmVkIGZyb20gd2l0aGluLFxuICAgICAgICAgICAgLy8gdGhlaXIgY2FsbGJhY2tzIHdpbGwgYWx3YXlzIGZpbmlzaCBleGVjdXRpb24gYnkgdGhlIHRpbWUgdGhlXG4gICAgICAgICAgICAvLyBuZXh0IG1lc3NhZ2UgZXZlbnQgaGFuZGxlciBpcyBydW4uXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gZW11bGF0ZSB0aGlzIGJlaGF2aW91ciwgd2UgbmVlZCB0byBtYWtlIHN1cmUgZWFjaFxuICAgICAgICAgICAgLy8gb25tZXNzYWdlIGhhbmRsZXIgaXMgcnVuIHdpdGhpbiBpdCdzIG93biBtYWNyb3Rhc2suXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5vbm1lc3NhZ2Uoe2RhdGE6IG1zZ30pXG4gICAgICAgICAgICB9LCAwKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgdGhpcy5wb2xsKClcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDIwNDpcbiAgICAgICAgICB0aGlzLnBvbGwoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDEwOlxuICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMub3BlblxuICAgICAgICAgIHRoaXMub25vcGVuKClcbiAgICAgICAgICB0aGlzLnBvbGwoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDAzOlxuICAgICAgICAgIHRoaXMub25lcnJvcigpXG4gICAgICAgICAgdGhpcy5jbG9zZSgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICBjYXNlIDUwMDpcbiAgICAgICAgICB0aGlzLm9uZXJyb3IoKVxuICAgICAgICAgIHRoaXMuY2xvc2VBbmRSZXRyeSgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKGB1bmhhbmRsZWQgcG9sbCBzdGF0dXMgJHtzdGF0dXN9YClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgc2VuZChib2R5KXtcbiAgICBBamF4LnJlcXVlc3QoXCJQT1NUXCIsIHRoaXMuZW5kcG9pbnRVUkwoKSwgXCJhcHBsaWNhdGlvbi9qc29uXCIsIGJvZHksIHRoaXMudGltZW91dCwgdGhpcy5vbmVycm9yLmJpbmQodGhpcywgXCJ0aW1lb3V0XCIpLCAocmVzcCkgPT4ge1xuICAgICAgaWYoIXJlc3AgfHwgcmVzcC5zdGF0dXMgIT09IDIwMCl7XG4gICAgICAgIHRoaXMub25lcnJvcihyZXNwICYmIHJlc3Auc3RhdHVzKVxuICAgICAgICB0aGlzLmNsb3NlQW5kUmV0cnkoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBjbG9zZShfY29kZSwgX3JlYXNvbil7XG4gICAgdGhpcy5yZWFkeVN0YXRlID0gU09DS0VUX1NUQVRFUy5jbG9zZWRcbiAgICB0aGlzLm9uY2xvc2UoKVxuICB9XG59XG4iLCAiLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgUHJlc2VuY2VcbiAqIEBwYXJhbSB7Q2hhbm5lbH0gY2hhbm5lbCAtIFRoZSBDaGFubmVsXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIFRoZSBvcHRpb25zLFxuICogICAgICAgIGZvciBleGFtcGxlIGB7ZXZlbnRzOiB7c3RhdGU6IFwic3RhdGVcIiwgZGlmZjogXCJkaWZmXCJ9fWBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJlc2VuY2Uge1xuXG4gIGNvbnN0cnVjdG9yKGNoYW5uZWwsIG9wdHMgPSB7fSl7XG4gICAgbGV0IGV2ZW50cyA9IG9wdHMuZXZlbnRzIHx8IHtzdGF0ZTogXCJwcmVzZW5jZV9zdGF0ZVwiLCBkaWZmOiBcInByZXNlbmNlX2RpZmZcIn1cbiAgICB0aGlzLnN0YXRlID0ge31cbiAgICB0aGlzLnBlbmRpbmdEaWZmcyA9IFtdXG4gICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbFxuICAgIHRoaXMuam9pblJlZiA9IG51bGxcbiAgICB0aGlzLmNhbGxlciA9IHtcbiAgICAgIG9uSm9pbjogZnVuY3Rpb24gKCl7IH0sXG4gICAgICBvbkxlYXZlOiBmdW5jdGlvbiAoKXsgfSxcbiAgICAgIG9uU3luYzogZnVuY3Rpb24gKCl7IH1cbiAgICB9XG5cbiAgICB0aGlzLmNoYW5uZWwub24oZXZlbnRzLnN0YXRlLCBuZXdTdGF0ZSA9PiB7XG4gICAgICBsZXQge29uSm9pbiwgb25MZWF2ZSwgb25TeW5jfSA9IHRoaXMuY2FsbGVyXG5cbiAgICAgIHRoaXMuam9pblJlZiA9IHRoaXMuY2hhbm5lbC5qb2luUmVmKClcbiAgICAgIHRoaXMuc3RhdGUgPSBQcmVzZW5jZS5zeW5jU3RhdGUodGhpcy5zdGF0ZSwgbmV3U3RhdGUsIG9uSm9pbiwgb25MZWF2ZSlcblxuICAgICAgdGhpcy5wZW5kaW5nRGlmZnMuZm9yRWFjaChkaWZmID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFByZXNlbmNlLnN5bmNEaWZmKHRoaXMuc3RhdGUsIGRpZmYsIG9uSm9pbiwgb25MZWF2ZSlcbiAgICAgIH0pXG4gICAgICB0aGlzLnBlbmRpbmdEaWZmcyA9IFtdXG4gICAgICBvblN5bmMoKVxuICAgIH0pXG5cbiAgICB0aGlzLmNoYW5uZWwub24oZXZlbnRzLmRpZmYsIGRpZmYgPT4ge1xuICAgICAgbGV0IHtvbkpvaW4sIG9uTGVhdmUsIG9uU3luY30gPSB0aGlzLmNhbGxlclxuXG4gICAgICBpZih0aGlzLmluUGVuZGluZ1N5bmNTdGF0ZSgpKXtcbiAgICAgICAgdGhpcy5wZW5kaW5nRGlmZnMucHVzaChkaWZmKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFByZXNlbmNlLnN5bmNEaWZmKHRoaXMuc3RhdGUsIGRpZmYsIG9uSm9pbiwgb25MZWF2ZSlcbiAgICAgICAgb25TeW5jKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgb25Kb2luKGNhbGxiYWNrKXsgdGhpcy5jYWxsZXIub25Kb2luID0gY2FsbGJhY2sgfVxuXG4gIG9uTGVhdmUoY2FsbGJhY2speyB0aGlzLmNhbGxlci5vbkxlYXZlID0gY2FsbGJhY2sgfVxuXG4gIG9uU3luYyhjYWxsYmFjayl7IHRoaXMuY2FsbGVyLm9uU3luYyA9IGNhbGxiYWNrIH1cblxuICBsaXN0KGJ5KXsgcmV0dXJuIFByZXNlbmNlLmxpc3QodGhpcy5zdGF0ZSwgYnkpIH1cblxuICBpblBlbmRpbmdTeW5jU3RhdGUoKXtcbiAgICByZXR1cm4gIXRoaXMuam9pblJlZiB8fCAodGhpcy5qb2luUmVmICE9PSB0aGlzLmNoYW5uZWwuam9pblJlZigpKVxuICB9XG5cbiAgLy8gbG93ZXItbGV2ZWwgcHVibGljIHN0YXRpYyBBUElcblxuICAvKipcbiAgICogVXNlZCB0byBzeW5jIHRoZSBsaXN0IG9mIHByZXNlbmNlcyBvbiB0aGUgc2VydmVyXG4gICAqIHdpdGggdGhlIGNsaWVudCdzIHN0YXRlLiBBbiBvcHRpb25hbCBgb25Kb2luYCBhbmQgYG9uTGVhdmVgIGNhbGxiYWNrIGNhblxuICAgKiBiZSBwcm92aWRlZCB0byByZWFjdCB0byBjaGFuZ2VzIGluIHRoZSBjbGllbnQncyBsb2NhbCBwcmVzZW5jZXMgYWNyb3NzXG4gICAqIGRpc2Nvbm5lY3RzIGFuZCByZWNvbm5lY3RzIHdpdGggdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHJldHVybnMge1ByZXNlbmNlfVxuICAgKi9cbiAgc3RhdGljIHN5bmNTdGF0ZShjdXJyZW50U3RhdGUsIG5ld1N0YXRlLCBvbkpvaW4sIG9uTGVhdmUpe1xuICAgIGxldCBzdGF0ZSA9IHRoaXMuY2xvbmUoY3VycmVudFN0YXRlKVxuICAgIGxldCBqb2lucyA9IHt9XG4gICAgbGV0IGxlYXZlcyA9IHt9XG5cbiAgICB0aGlzLm1hcChzdGF0ZSwgKGtleSwgcHJlc2VuY2UpID0+IHtcbiAgICAgIGlmKCFuZXdTdGF0ZVtrZXldKXtcbiAgICAgICAgbGVhdmVzW2tleV0gPSBwcmVzZW5jZVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5tYXAobmV3U3RhdGUsIChrZXksIG5ld1ByZXNlbmNlKSA9PiB7XG4gICAgICBsZXQgY3VycmVudFByZXNlbmNlID0gc3RhdGVba2V5XVxuICAgICAgaWYoY3VycmVudFByZXNlbmNlKXtcbiAgICAgICAgbGV0IG5ld1JlZnMgPSBuZXdQcmVzZW5jZS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICAgIGxldCBjdXJSZWZzID0gY3VycmVudFByZXNlbmNlLm1ldGFzLm1hcChtID0+IG0ucGh4X3JlZilcbiAgICAgICAgbGV0IGpvaW5lZE1ldGFzID0gbmV3UHJlc2VuY2UubWV0YXMuZmlsdGVyKG0gPT4gY3VyUmVmcy5pbmRleE9mKG0ucGh4X3JlZikgPCAwKVxuICAgICAgICBsZXQgbGVmdE1ldGFzID0gY3VycmVudFByZXNlbmNlLm1ldGFzLmZpbHRlcihtID0+IG5ld1JlZnMuaW5kZXhPZihtLnBoeF9yZWYpIDwgMClcbiAgICAgICAgaWYoam9pbmVkTWV0YXMubGVuZ3RoID4gMCl7XG4gICAgICAgICAgam9pbnNba2V5XSA9IG5ld1ByZXNlbmNlXG4gICAgICAgICAgam9pbnNba2V5XS5tZXRhcyA9IGpvaW5lZE1ldGFzXG4gICAgICAgIH1cbiAgICAgICAgaWYobGVmdE1ldGFzLmxlbmd0aCA+IDApe1xuICAgICAgICAgIGxlYXZlc1trZXldID0gdGhpcy5jbG9uZShjdXJyZW50UHJlc2VuY2UpXG4gICAgICAgICAgbGVhdmVzW2tleV0ubWV0YXMgPSBsZWZ0TWV0YXNcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgam9pbnNba2V5XSA9IG5ld1ByZXNlbmNlXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gdGhpcy5zeW5jRGlmZihzdGF0ZSwge2pvaW5zOiBqb2lucywgbGVhdmVzOiBsZWF2ZXN9LCBvbkpvaW4sIG9uTGVhdmUpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVXNlZCB0byBzeW5jIGEgZGlmZiBvZiBwcmVzZW5jZSBqb2luIGFuZCBsZWF2ZVxuICAgKiBldmVudHMgZnJvbSB0aGUgc2VydmVyLCBhcyB0aGV5IGhhcHBlbi4gTGlrZSBgc3luY1N0YXRlYCwgYHN5bmNEaWZmYFxuICAgKiBhY2NlcHRzIG9wdGlvbmFsIGBvbkpvaW5gIGFuZCBgb25MZWF2ZWAgY2FsbGJhY2tzIHRvIHJlYWN0IHRvIGEgdXNlclxuICAgKiBqb2luaW5nIG9yIGxlYXZpbmcgZnJvbSBhIGRldmljZS5cbiAgICpcbiAgICogQHJldHVybnMge1ByZXNlbmNlfVxuICAgKi9cbiAgc3RhdGljIHN5bmNEaWZmKHN0YXRlLCBkaWZmLCBvbkpvaW4sIG9uTGVhdmUpe1xuICAgIGxldCB7am9pbnMsIGxlYXZlc30gPSB0aGlzLmNsb25lKGRpZmYpXG4gICAgaWYoIW9uSm9pbil7IG9uSm9pbiA9IGZ1bmN0aW9uICgpeyB9IH1cbiAgICBpZighb25MZWF2ZSl7IG9uTGVhdmUgPSBmdW5jdGlvbiAoKXsgfSB9XG5cbiAgICB0aGlzLm1hcChqb2lucywgKGtleSwgbmV3UHJlc2VuY2UpID0+IHtcbiAgICAgIGxldCBjdXJyZW50UHJlc2VuY2UgPSBzdGF0ZVtrZXldXG4gICAgICBzdGF0ZVtrZXldID0gdGhpcy5jbG9uZShuZXdQcmVzZW5jZSlcbiAgICAgIGlmKGN1cnJlbnRQcmVzZW5jZSl7XG4gICAgICAgIGxldCBqb2luZWRSZWZzID0gc3RhdGVba2V5XS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICAgIGxldCBjdXJNZXRhcyA9IGN1cnJlbnRQcmVzZW5jZS5tZXRhcy5maWx0ZXIobSA9PiBqb2luZWRSZWZzLmluZGV4T2YobS5waHhfcmVmKSA8IDApXG4gICAgICAgIHN0YXRlW2tleV0ubWV0YXMudW5zaGlmdCguLi5jdXJNZXRhcylcbiAgICAgIH1cbiAgICAgIG9uSm9pbihrZXksIGN1cnJlbnRQcmVzZW5jZSwgbmV3UHJlc2VuY2UpXG4gICAgfSlcbiAgICB0aGlzLm1hcChsZWF2ZXMsIChrZXksIGxlZnRQcmVzZW5jZSkgPT4ge1xuICAgICAgbGV0IGN1cnJlbnRQcmVzZW5jZSA9IHN0YXRlW2tleV1cbiAgICAgIGlmKCFjdXJyZW50UHJlc2VuY2UpeyByZXR1cm4gfVxuICAgICAgbGV0IHJlZnNUb1JlbW92ZSA9IGxlZnRQcmVzZW5jZS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICBjdXJyZW50UHJlc2VuY2UubWV0YXMgPSBjdXJyZW50UHJlc2VuY2UubWV0YXMuZmlsdGVyKHAgPT4ge1xuICAgICAgICByZXR1cm4gcmVmc1RvUmVtb3ZlLmluZGV4T2YocC5waHhfcmVmKSA8IDBcbiAgICAgIH0pXG4gICAgICBvbkxlYXZlKGtleSwgY3VycmVudFByZXNlbmNlLCBsZWZ0UHJlc2VuY2UpXG4gICAgICBpZihjdXJyZW50UHJlc2VuY2UubWV0YXMubGVuZ3RoID09PSAwKXtcbiAgICAgICAgZGVsZXRlIHN0YXRlW2tleV1cbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBzdGF0ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIHByZXNlbmNlcywgd2l0aCBzZWxlY3RlZCBtZXRhZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHByZXNlbmNlc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjaG9vc2VyXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcmVzZW5jZX1cbiAgICovXG4gIHN0YXRpYyBsaXN0KHByZXNlbmNlcywgY2hvb3Nlcil7XG4gICAgaWYoIWNob29zZXIpeyBjaG9vc2VyID0gZnVuY3Rpb24gKGtleSwgcHJlcyl7IHJldHVybiBwcmVzIH0gfVxuXG4gICAgcmV0dXJuIHRoaXMubWFwKHByZXNlbmNlcywgKGtleSwgcHJlc2VuY2UpID0+IHtcbiAgICAgIHJldHVybiBjaG9vc2VyKGtleSwgcHJlc2VuY2UpXG4gICAgfSlcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICBzdGF0aWMgbWFwKG9iaiwgZnVuYyl7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubWFwKGtleSA9PiBmdW5jKGtleSwgb2JqW2tleV0pKVxuICB9XG5cbiAgc3RhdGljIGNsb25lKG9iail7IHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpIH1cbn1cbiIsICIvKiBUaGUgZGVmYXVsdCBzZXJpYWxpemVyIGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgbWVzc2FnZXMgKi9cbmltcG9ydCB7XG4gIENIQU5ORUxfRVZFTlRTXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgSEVBREVSX0xFTkdUSDogMSxcbiAgTUVUQV9MRU5HVEg6IDQsXG4gIEtJTkRTOiB7cHVzaDogMCwgcmVwbHk6IDEsIGJyb2FkY2FzdDogMn0sXG5cbiAgZW5jb2RlKG1zZywgY2FsbGJhY2spe1xuICAgIGlmKG1zZy5wYXlsb2FkLmNvbnN0cnVjdG9yID09PSBBcnJheUJ1ZmZlcil7XG4gICAgICByZXR1cm4gY2FsbGJhY2sodGhpcy5iaW5hcnlFbmNvZGUobXNnKSlcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHBheWxvYWQgPSBbbXNnLmpvaW5fcmVmLCBtc2cucmVmLCBtc2cudG9waWMsIG1zZy5ldmVudCwgbXNnLnBheWxvYWRdXG4gICAgICByZXR1cm4gY2FsbGJhY2soSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpXG4gICAgfVxuICB9LFxuXG4gIGRlY29kZShyYXdQYXlsb2FkLCBjYWxsYmFjayl7XG4gICAgaWYocmF3UGF5bG9hZC5jb25zdHJ1Y3RvciA9PT0gQXJyYXlCdWZmZXIpe1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKHRoaXMuYmluYXJ5RGVjb2RlKHJhd1BheWxvYWQpKVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgW2pvaW5fcmVmLCByZWYsIHRvcGljLCBldmVudCwgcGF5bG9hZF0gPSBKU09OLnBhcnNlKHJhd1BheWxvYWQpXG4gICAgICByZXR1cm4gY2FsbGJhY2soe2pvaW5fcmVmLCByZWYsIHRvcGljLCBldmVudCwgcGF5bG9hZH0pXG4gICAgfVxuICB9LFxuXG4gIC8vIHByaXZhdGVcblxuICBiaW5hcnlFbmNvZGUobWVzc2FnZSl7XG4gICAgbGV0IHtqb2luX3JlZiwgcmVmLCBldmVudCwgdG9waWMsIHBheWxvYWR9ID0gbWVzc2FnZVxuICAgIGxldCBtZXRhTGVuZ3RoID0gdGhpcy5NRVRBX0xFTkdUSCArIGpvaW5fcmVmLmxlbmd0aCArIHJlZi5sZW5ndGggKyB0b3BpYy5sZW5ndGggKyBldmVudC5sZW5ndGhcbiAgICBsZXQgaGVhZGVyID0gbmV3IEFycmF5QnVmZmVyKHRoaXMuSEVBREVSX0xFTkdUSCArIG1ldGFMZW5ndGgpXG4gICAgbGV0IHZpZXcgPSBuZXcgRGF0YVZpZXcoaGVhZGVyKVxuICAgIGxldCBvZmZzZXQgPSAwXG5cbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB0aGlzLktJTkRTLnB1c2gpIC8vIGtpbmRcbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBqb2luX3JlZi5sZW5ndGgpXG4gICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgcmVmLmxlbmd0aClcbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB0b3BpYy5sZW5ndGgpXG4gICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgZXZlbnQubGVuZ3RoKVxuICAgIEFycmF5LmZyb20oam9pbl9yZWYsIGNoYXIgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSlcbiAgICBBcnJheS5mcm9tKHJlZiwgY2hhciA9PiB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBjaGFyLmNoYXJDb2RlQXQoMCkpKVxuICAgIEFycmF5LmZyb20odG9waWMsIGNoYXIgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSlcbiAgICBBcnJheS5mcm9tKGV2ZW50LCBjaGFyID0+IHZpZXcuc2V0VWludDgob2Zmc2V0KyssIGNoYXIuY2hhckNvZGVBdCgwKSkpXG5cbiAgICB2YXIgY29tYmluZWQgPSBuZXcgVWludDhBcnJheShoZWFkZXIuYnl0ZUxlbmd0aCArIHBheWxvYWQuYnl0ZUxlbmd0aClcbiAgICBjb21iaW5lZC5zZXQobmV3IFVpbnQ4QXJyYXkoaGVhZGVyKSwgMClcbiAgICBjb21iaW5lZC5zZXQobmV3IFVpbnQ4QXJyYXkocGF5bG9hZCksIGhlYWRlci5ieXRlTGVuZ3RoKVxuXG4gICAgcmV0dXJuIGNvbWJpbmVkLmJ1ZmZlclxuICB9LFxuXG4gIGJpbmFyeURlY29kZShidWZmZXIpe1xuICAgIGxldCB2aWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcilcbiAgICBsZXQga2luZCA9IHZpZXcuZ2V0VWludDgoMClcbiAgICBsZXQgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpXG4gICAgc3dpdGNoKGtpbmQpe1xuICAgICAgY2FzZSB0aGlzLktJTkRTLnB1c2g6IHJldHVybiB0aGlzLmRlY29kZVB1c2goYnVmZmVyLCB2aWV3LCBkZWNvZGVyKVxuICAgICAgY2FzZSB0aGlzLktJTkRTLnJlcGx5OiByZXR1cm4gdGhpcy5kZWNvZGVSZXBseShidWZmZXIsIHZpZXcsIGRlY29kZXIpXG4gICAgICBjYXNlIHRoaXMuS0lORFMuYnJvYWRjYXN0OiByZXR1cm4gdGhpcy5kZWNvZGVCcm9hZGNhc3QoYnVmZmVyLCB2aWV3LCBkZWNvZGVyKVxuICAgIH1cbiAgfSxcblxuICBkZWNvZGVQdXNoKGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IGpvaW5SZWZTaXplID0gdmlldy5nZXRVaW50OCgxKVxuICAgIGxldCB0b3BpY1NpemUgPSB2aWV3LmdldFVpbnQ4KDIpXG4gICAgbGV0IGV2ZW50U2l6ZSA9IHZpZXcuZ2V0VWludDgoMylcbiAgICBsZXQgb2Zmc2V0ID0gdGhpcy5IRUFERVJfTEVOR1RIICsgdGhpcy5NRVRBX0xFTkdUSCAtIDEgLy8gcHVzaGVzIGhhdmUgbm8gcmVmXG4gICAgbGV0IGpvaW5SZWYgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBqb2luUmVmU2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgam9pblJlZlNpemVcbiAgICBsZXQgdG9waWMgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyB0b3BpY1NpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHRvcGljU2l6ZVxuICAgIGxldCBldmVudCA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGV2ZW50U2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgZXZlbnRTaXplXG4gICAgbGV0IGRhdGEgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aClcbiAgICByZXR1cm4ge2pvaW5fcmVmOiBqb2luUmVmLCByZWY6IG51bGwsIHRvcGljOiB0b3BpYywgZXZlbnQ6IGV2ZW50LCBwYXlsb2FkOiBkYXRhfVxuICB9LFxuXG4gIGRlY29kZVJlcGx5KGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IGpvaW5SZWZTaXplID0gdmlldy5nZXRVaW50OCgxKVxuICAgIGxldCByZWZTaXplID0gdmlldy5nZXRVaW50OCgyKVxuICAgIGxldCB0b3BpY1NpemUgPSB2aWV3LmdldFVpbnQ4KDMpXG4gICAgbGV0IGV2ZW50U2l6ZSA9IHZpZXcuZ2V0VWludDgoNClcbiAgICBsZXQgb2Zmc2V0ID0gdGhpcy5IRUFERVJfTEVOR1RIICsgdGhpcy5NRVRBX0xFTkdUSFxuICAgIGxldCBqb2luUmVmID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgam9pblJlZlNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIGpvaW5SZWZTaXplXG4gICAgbGV0IHJlZiA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIHJlZlNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHJlZlNpemVcbiAgICBsZXQgdG9waWMgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyB0b3BpY1NpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHRvcGljU2l6ZVxuICAgIGxldCBldmVudCA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGV2ZW50U2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgZXZlbnRTaXplXG4gICAgbGV0IGRhdGEgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aClcbiAgICBsZXQgcGF5bG9hZCA9IHtzdGF0dXM6IGV2ZW50LCByZXNwb25zZTogZGF0YX1cbiAgICByZXR1cm4ge2pvaW5fcmVmOiBqb2luUmVmLCByZWY6IHJlZiwgdG9waWM6IHRvcGljLCBldmVudDogQ0hBTk5FTF9FVkVOVFMucmVwbHksIHBheWxvYWQ6IHBheWxvYWR9XG4gIH0sXG5cbiAgZGVjb2RlQnJvYWRjYXN0KGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IHRvcGljU2l6ZSA9IHZpZXcuZ2V0VWludDgoMSlcbiAgICBsZXQgZXZlbnRTaXplID0gdmlldy5nZXRVaW50OCgyKVxuICAgIGxldCBvZmZzZXQgPSB0aGlzLkhFQURFUl9MRU5HVEggKyAyXG4gICAgbGV0IHRvcGljID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgdG9waWNTaXplKSlcbiAgICBvZmZzZXQgPSBvZmZzZXQgKyB0b3BpY1NpemVcbiAgICBsZXQgZXZlbnQgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBldmVudFNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIGV2ZW50U2l6ZVxuICAgIGxldCBkYXRhID0gYnVmZmVyLnNsaWNlKG9mZnNldCwgYnVmZmVyLmJ5dGVMZW5ndGgpXG5cbiAgICByZXR1cm4ge2pvaW5fcmVmOiBudWxsLCByZWY6IG51bGwsIHRvcGljOiB0b3BpYywgZXZlbnQ6IGV2ZW50LCBwYXlsb2FkOiBkYXRhfVxuICB9XG59XG4iLCAiLyoqIEluaXRpYWxpemVzIHRoZSBTb2NrZXQgKlxuICpcbiAqIEZvciBJRTggc3VwcG9ydCB1c2UgYW4gRVM1LXNoaW0gKGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbSlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5kUG9pbnQgLSBUaGUgc3RyaW5nIFdlYlNvY2tldCBlbmRwb2ludCwgaWUsIGBcIndzOi8vZXhhbXBsZS5jb20vc29ja2V0XCJgLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcIndzczovL2V4YW1wbGUuY29tXCJgXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFwiL3NvY2tldFwiYCAoaW5oZXJpdGVkIGhvc3QgJiBwcm90b2NvbClcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c10gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy50cmFuc3BvcnRdIC0gVGhlIFdlYnNvY2tldCBUcmFuc3BvcnQsIGZvciBleGFtcGxlIFdlYlNvY2tldCBvciBQaG9lbml4LkxvbmdQb2xsLlxuICpcbiAqIERlZmF1bHRzIHRvIFdlYlNvY2tldCB3aXRoIGF1dG9tYXRpYyBMb25nUG9sbCBmYWxsYmFjay5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRzLmVuY29kZV0gLSBUaGUgZnVuY3Rpb24gdG8gZW5jb2RlIG91dGdvaW5nIG1lc3NhZ2VzLlxuICpcbiAqIERlZmF1bHRzIHRvIEpTT04gZW5jb2Rlci5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5kZWNvZGVdIC0gVGhlIGZ1bmN0aW9uIHRvIGRlY29kZSBpbmNvbWluZyBtZXNzYWdlcy5cbiAqXG4gKiBEZWZhdWx0cyB0byBKU09OOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIChwYXlsb2FkLCBjYWxsYmFjaykgPT4gY2FsbGJhY2soSlNPTi5wYXJzZShwYXlsb2FkKSlcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy50aW1lb3V0XSAtIFRoZSBkZWZhdWx0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIHRyaWdnZXIgcHVzaCB0aW1lb3V0cy5cbiAqXG4gKiBEZWZhdWx0cyBgREVGQVVMVF9USU1FT1VUYFxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmhlYXJ0YmVhdEludGVydmFsTXNdIC0gVGhlIG1pbGxpc2VjIGludGVydmFsIHRvIHNlbmQgYSBoZWFydGJlYXQgbWVzc2FnZVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLnJlY29ubmVjdEFmdGVyTXNdIC0gVGhlIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbWlsbHNlY1xuICogc29ja2V0IHJlY29ubmVjdCBpbnRlcnZhbC5cbiAqXG4gKiBEZWZhdWx0cyB0byBzdGVwcGVkIGJhY2tvZmYgb2Y6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogZnVuY3Rpb24odHJpZXMpe1xuICogICByZXR1cm4gWzEwLCA1MCwgMTAwLCAxNTAsIDIwMCwgMjUwLCA1MDAsIDEwMDAsIDIwMDBdW3RyaWVzIC0gMV0gfHwgNTAwMFxuICogfVxuICogYGBgYFxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5yZWpvaW5BZnRlck1zXSAtIFRoZSBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG1pbGxzZWNcbiAqIHJlam9pbiBpbnRlcnZhbCBmb3IgaW5kaXZpZHVhbCBjaGFubmVscy5cbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBmdW5jdGlvbih0cmllcyl7XG4gKiAgIHJldHVybiBbMTAwMCwgMjAwMCwgNTAwMF1bdHJpZXMgLSAxXSB8fCAxMDAwMFxuICogfVxuICogYGBgYFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRzLmxvZ2dlcl0gLSBUaGUgb3B0aW9uYWwgZnVuY3Rpb24gZm9yIHNwZWNpYWxpemVkIGxvZ2dpbmcsIGllOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGZ1bmN0aW9uKGtpbmQsIG1zZywgZGF0YSkge1xuICogICBjb25zb2xlLmxvZyhgJHtraW5kfTogJHttc2d9YCwgZGF0YSlcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5sb25ncG9sbGVyVGltZW91dF0gLSBUaGUgbWF4aW11bSB0aW1lb3V0IG9mIGEgbG9uZyBwb2xsIEFKQVggcmVxdWVzdC5cbiAqXG4gKiBEZWZhdWx0cyB0byAyMHMgKGRvdWJsZSB0aGUgc2VydmVyIGxvbmcgcG9sbCB0aW1lcikuXG4gKlxuICogQHBhcmFtIHt7T2JqZWN0fGZ1bmN0aW9uKX0gW29wdHMucGFyYW1zXSAtIFRoZSBvcHRpb25hbCBwYXJhbXMgdG8gcGFzcyB3aGVuIGNvbm5lY3RpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5iaW5hcnlUeXBlXSAtIFRoZSBiaW5hcnkgdHlwZSB0byB1c2UgZm9yIGJpbmFyeSBXZWJTb2NrZXQgZnJhbWVzLlxuICpcbiAqIERlZmF1bHRzIHRvIFwiYXJyYXlidWZmZXJcIlxuICpcbiAqIEBwYXJhbSB7dnNufSBbb3B0cy52c25dIC0gVGhlIHNlcmlhbGl6ZXIncyBwcm90b2NvbCB2ZXJzaW9uIHRvIHNlbmQgb24gY29ubmVjdC5cbiAqXG4gKiBEZWZhdWx0cyB0byBERUZBVUxUX1ZTTi5cbiovXG5cbmltcG9ydCB7XG4gIGdsb2JhbCxcbiAgcGh4V2luZG93LFxuICBDSEFOTkVMX0VWRU5UUyxcbiAgREVGQVVMVF9USU1FT1VULFxuICBERUZBVUxUX1ZTTixcbiAgU09DS0VUX1NUQVRFUyxcbiAgVFJBTlNQT1JUUyxcbiAgV1NfQ0xPU0VfTk9STUFMXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCB7XG4gIGNsb3N1cmVcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5pbXBvcnQgQWpheCBmcm9tIFwiLi9hamF4XCJcbmltcG9ydCBDaGFubmVsIGZyb20gXCIuL2NoYW5uZWxcIlxuaW1wb3J0IExvbmdQb2xsIGZyb20gXCIuL2xvbmdwb2xsXCJcbmltcG9ydCBTZXJpYWxpemVyIGZyb20gXCIuL3NlcmlhbGl6ZXJcIlxuaW1wb3J0IFRpbWVyIGZyb20gXCIuL3RpbWVyXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU29ja2V0IHtcbiAgY29uc3RydWN0b3IoZW5kUG9pbnQsIG9wdHMgPSB7fSl7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcyA9IHtvcGVuOiBbXSwgY2xvc2U6IFtdLCBlcnJvcjogW10sIG1lc3NhZ2U6IFtdfVxuICAgIHRoaXMuY2hhbm5lbHMgPSBbXVxuICAgIHRoaXMuc2VuZEJ1ZmZlciA9IFtdXG4gICAgdGhpcy5yZWYgPSAwXG4gICAgdGhpcy50aW1lb3V0ID0gb3B0cy50aW1lb3V0IHx8IERFRkFVTFRfVElNRU9VVFxuICAgIHRoaXMudHJhbnNwb3J0ID0gb3B0cy50cmFuc3BvcnQgfHwgZ2xvYmFsLldlYlNvY2tldCB8fCBMb25nUG9sbFxuICAgIHRoaXMuZXN0YWJsaXNoZWRDb25uZWN0aW9ucyA9IDBcbiAgICB0aGlzLmRlZmF1bHRFbmNvZGVyID0gU2VyaWFsaXplci5lbmNvZGUuYmluZChTZXJpYWxpemVyKVxuICAgIHRoaXMuZGVmYXVsdERlY29kZXIgPSBTZXJpYWxpemVyLmRlY29kZS5iaW5kKFNlcmlhbGl6ZXIpXG4gICAgdGhpcy5jbG9zZVdhc0NsZWFuID0gZmFsc2VcbiAgICB0aGlzLmJpbmFyeVR5cGUgPSBvcHRzLmJpbmFyeVR5cGUgfHwgXCJhcnJheWJ1ZmZlclwiXG4gICAgdGhpcy5jb25uZWN0Q2xvY2sgPSAxXG4gICAgaWYodGhpcy50cmFuc3BvcnQgIT09IExvbmdQb2xsKXtcbiAgICAgIHRoaXMuZW5jb2RlID0gb3B0cy5lbmNvZGUgfHwgdGhpcy5kZWZhdWx0RW5jb2RlclxuICAgICAgdGhpcy5kZWNvZGUgPSBvcHRzLmRlY29kZSB8fCB0aGlzLmRlZmF1bHREZWNvZGVyXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW5jb2RlID0gdGhpcy5kZWZhdWx0RW5jb2RlclxuICAgICAgdGhpcy5kZWNvZGUgPSB0aGlzLmRlZmF1bHREZWNvZGVyXG4gICAgfVxuICAgIGxldCBhd2FpdGluZ0Nvbm5lY3Rpb25PblBhZ2VTaG93ID0gbnVsbFxuICAgIGlmKHBoeFdpbmRvdyAmJiBwaHhXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcil7XG4gICAgICBwaHhXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsIF9lID0+IHtcbiAgICAgICAgaWYodGhpcy5jb25uKXtcbiAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKVxuICAgICAgICAgIGF3YWl0aW5nQ29ubmVjdGlvbk9uUGFnZVNob3cgPSB0aGlzLmNvbm5lY3RDbG9ja1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgcGh4V2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlc2hvd1wiLCBfZSA9PiB7XG4gICAgICAgIGlmKGF3YWl0aW5nQ29ubmVjdGlvbk9uUGFnZVNob3cgPT09IHRoaXMuY29ubmVjdENsb2NrKXtcbiAgICAgICAgICBhd2FpdGluZ0Nvbm5lY3Rpb25PblBhZ2VTaG93ID0gbnVsbFxuICAgICAgICAgIHRoaXMuY29ubmVjdCgpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxNcyA9IG9wdHMuaGVhcnRiZWF0SW50ZXJ2YWxNcyB8fCAzMDAwMFxuICAgIHRoaXMucmVqb2luQWZ0ZXJNcyA9ICh0cmllcykgPT4ge1xuICAgICAgaWYob3B0cy5yZWpvaW5BZnRlck1zKXtcbiAgICAgICAgcmV0dXJuIG9wdHMucmVqb2luQWZ0ZXJNcyh0cmllcylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbMTAwMCwgMjAwMCwgNTAwMF1bdHJpZXMgLSAxXSB8fCAxMDAwMFxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlY29ubmVjdEFmdGVyTXMgPSAodHJpZXMpID0+IHtcbiAgICAgIGlmKG9wdHMucmVjb25uZWN0QWZ0ZXJNcyl7XG4gICAgICAgIHJldHVybiBvcHRzLnJlY29ubmVjdEFmdGVyTXModHJpZXMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gWzEwLCA1MCwgMTAwLCAxNTAsIDIwMCwgMjUwLCA1MDAsIDEwMDAsIDIwMDBdW3RyaWVzIC0gMV0gfHwgNTAwMFxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxvZ2dlciA9IG9wdHMubG9nZ2VyIHx8IG51bGxcbiAgICB0aGlzLmxvbmdwb2xsZXJUaW1lb3V0ID0gb3B0cy5sb25ncG9sbGVyVGltZW91dCB8fCAyMDAwMFxuICAgIHRoaXMucGFyYW1zID0gY2xvc3VyZShvcHRzLnBhcmFtcyB8fCB7fSlcbiAgICB0aGlzLmVuZFBvaW50ID0gYCR7ZW5kUG9pbnR9LyR7VFJBTlNQT1JUUy53ZWJzb2NrZXR9YFxuICAgIHRoaXMudnNuID0gb3B0cy52c24gfHwgREVGQVVMVF9WU05cbiAgICB0aGlzLmhlYXJ0YmVhdFRpbWVyID0gbnVsbFxuICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGxcbiAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbmV3IFRpbWVyKCgpID0+IHtcbiAgICAgIHRoaXMudGVhcmRvd24oKCkgPT4gdGhpcy5jb25uZWN0KCkpXG4gICAgfSwgdGhpcy5yZWNvbm5lY3RBZnRlck1zKVxuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIGFuZCByZXBsYWNlcyB0aGUgYWN0aXZlIHRyYW5zcG9ydFxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBuZXdUcmFuc3BvcnQgLSBUaGUgbmV3IHRyYW5zcG9ydCBjbGFzcyB0byBpbnN0YW50aWF0ZVxuICAgKlxuICAgKi9cbiAgcmVwbGFjZVRyYW5zcG9ydChuZXdUcmFuc3BvcnQpe1xuICAgIHRoaXMuZGlzY29ubmVjdCgpXG4gICAgdGhpcy50cmFuc3BvcnQgPSBuZXdUcmFuc3BvcnRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzb2NrZXQgcHJvdG9jb2xcbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHByb3RvY29sKCl7IHJldHVybiBsb2NhdGlvbi5wcm90b2NvbC5tYXRjaCgvXmh0dHBzLykgPyBcIndzc1wiIDogXCJ3c1wiIH1cblxuICAvKipcbiAgICogVGhlIGZ1bGx5IHF1YWxpZmVkIHNvY2tldCB1cmxcbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGVuZFBvaW50VVJMKCl7XG4gICAgbGV0IHVyaSA9IEFqYXguYXBwZW5kUGFyYW1zKFxuICAgICAgQWpheC5hcHBlbmRQYXJhbXModGhpcy5lbmRQb2ludCwgdGhpcy5wYXJhbXMoKSksIHt2c246IHRoaXMudnNufSlcbiAgICBpZih1cmkuY2hhckF0KDApICE9PSBcIi9cIil7IHJldHVybiB1cmkgfVxuICAgIGlmKHVyaS5jaGFyQXQoMSkgPT09IFwiL1wiKXsgcmV0dXJuIGAke3RoaXMucHJvdG9jb2woKX06JHt1cml9YCB9XG5cbiAgICByZXR1cm4gYCR7dGhpcy5wcm90b2NvbCgpfTovLyR7bG9jYXRpb24uaG9zdH0ke3VyaX1gXG4gIH1cblxuICAvKipcbiAgICogRGlzY29ubmVjdHMgdGhlIHNvY2tldFxuICAgKlxuICAgKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Nsb3NlRXZlbnQjU3RhdHVzX2NvZGVzIGZvciB2YWxpZCBzdGF0dXMgY29kZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gT3B0aW9uYWwgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIGFmdGVyIHNvY2tldCBpcyBkaXNjb25uZWN0ZWQuXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gY29kZSAtIEEgc3RhdHVzIGNvZGUgZm9yIGRpc2Nvbm5lY3Rpb24gKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbiAtIEEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgcmVhc29uIHRvIGRpc2Nvbm5lY3QuIChPcHRpb25hbClcbiAgICovXG4gIGRpc2Nvbm5lY3QoY2FsbGJhY2ssIGNvZGUsIHJlYXNvbil7XG4gICAgdGhpcy5jb25uZWN0Q2xvY2srK1xuICAgIHRoaXMuY2xvc2VXYXNDbGVhbiA9IHRydWVcbiAgICB0aGlzLnJlY29ubmVjdFRpbWVyLnJlc2V0KClcbiAgICB0aGlzLnRlYXJkb3duKGNhbGxiYWNrLCBjb2RlLCByZWFzb24pXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIFRoZSBwYXJhbXMgdG8gc2VuZCB3aGVuIGNvbm5lY3RpbmcsIGZvciBleGFtcGxlIGB7dXNlcl9pZDogdXNlclRva2VufWBcbiAgICpcbiAgICogUGFzc2luZyBwYXJhbXMgdG8gY29ubmVjdCBpcyBkZXByZWNhdGVkOyBwYXNzIHRoZW0gaW4gdGhlIFNvY2tldCBjb25zdHJ1Y3RvciBpbnN0ZWFkOlxuICAgKiBgbmV3IFNvY2tldChcIi9zb2NrZXRcIiwge3BhcmFtczoge3VzZXJfaWQ6IHVzZXJUb2tlbn19KWAuXG4gICAqL1xuICBjb25uZWN0KHBhcmFtcyl7XG4gICAgdGhpcy5jb25uZWN0Q2xvY2srK1xuICAgIGlmKHBhcmFtcyl7XG4gICAgICBjb25zb2xlICYmIGNvbnNvbGUubG9nKFwicGFzc2luZyBwYXJhbXMgdG8gY29ubmVjdCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkIHBhc3MgOnBhcmFtcyB0byB0aGUgU29ja2V0IGNvbnN0cnVjdG9yXCIpXG4gICAgICB0aGlzLnBhcmFtcyA9IGNsb3N1cmUocGFyYW1zKVxuICAgIH1cbiAgICBpZih0aGlzLmNvbm4peyByZXR1cm4gfVxuICAgIHRoaXMuY2xvc2VXYXNDbGVhbiA9IGZhbHNlXG4gICAgdGhpcy5jb25uID0gbmV3IHRoaXMudHJhbnNwb3J0KHRoaXMuZW5kUG9pbnRVUkwoKSlcbiAgICB0aGlzLmNvbm4uYmluYXJ5VHlwZSA9IHRoaXMuYmluYXJ5VHlwZVxuICAgIHRoaXMuY29ubi50aW1lb3V0ID0gdGhpcy5sb25ncG9sbGVyVGltZW91dFxuICAgIHRoaXMuY29ubi5vbm9wZW4gPSAoKSA9PiB0aGlzLm9uQ29ubk9wZW4oKVxuICAgIHRoaXMuY29ubi5vbmVycm9yID0gZXJyb3IgPT4gdGhpcy5vbkNvbm5FcnJvcihlcnJvcilcbiAgICB0aGlzLmNvbm4ub25tZXNzYWdlID0gZXZlbnQgPT4gdGhpcy5vbkNvbm5NZXNzYWdlKGV2ZW50KVxuICAgIHRoaXMuY29ubi5vbmNsb3NlID0gZXZlbnQgPT4gdGhpcy5vbkNvbm5DbG9zZShldmVudClcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIHRoZSBtZXNzYWdlLiBPdmVycmlkZSBgdGhpcy5sb2dnZXJgIGZvciBzcGVjaWFsaXplZCBsb2dnaW5nLiBub29wcyBieSBkZWZhdWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBraW5kXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtc2dcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICovXG4gIGxvZyhraW5kLCBtc2csIGRhdGEpeyB0aGlzLmxvZ2dlcihraW5kLCBtc2csIGRhdGEpIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGEgbG9nZ2VyIGhhcyBiZWVuIHNldCBvbiB0aGlzIHNvY2tldC5cbiAgICovXG4gIGhhc0xvZ2dlcigpeyByZXR1cm4gdGhpcy5sb2dnZXIgIT09IG51bGwgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgY2FsbGJhY2tzIGZvciBjb25uZWN0aW9uIG9wZW4gZXZlbnRzXG4gICAqXG4gICAqIEBleGFtcGxlIHNvY2tldC5vbk9wZW4oZnVuY3Rpb24oKXsgY29uc29sZS5pbmZvKFwidGhlIHNvY2tldCB3YXMgb3BlbmVkXCIpIH0pXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbk9wZW4oY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3Mub3Blbi5wdXNoKFtyZWYsIGNhbGxiYWNrXSlcbiAgICByZXR1cm4gcmVmXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGNhbGxiYWNrcyBmb3IgY29ubmVjdGlvbiBjbG9zZSBldmVudHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIG9uQ2xvc2UoY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MuY2xvc2UucHVzaChbcmVmLCBjYWxsYmFja10pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBjYWxsYmFja3MgZm9yIGNvbm5lY3Rpb24gZXJyb3IgZXZlbnRzXG4gICAqXG4gICAqIEBleGFtcGxlIHNvY2tldC5vbkVycm9yKGZ1bmN0aW9uKGVycm9yKXsgYWxlcnQoXCJBbiBlcnJvciBvY2N1cnJlZFwiKSB9KVxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25FcnJvcihjYWxsYmFjayl7XG4gICAgbGV0IHJlZiA9IHRoaXMubWFrZVJlZigpXG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5lcnJvci5wdXNoKFtyZWYsIGNhbGxiYWNrXSlcbiAgICByZXR1cm4gcmVmXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGNhbGxiYWNrcyBmb3IgY29ubmVjdGlvbiBtZXNzYWdlIGV2ZW50c1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25NZXNzYWdlKGNhbGxiYWNrKXtcbiAgICBsZXQgcmVmID0gdGhpcy5tYWtlUmVmKClcbiAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLm1lc3NhZ2UucHVzaChbcmVmLCBjYWxsYmFja10pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBvbkNvbm5PcGVuKCl7XG4gICAgaWYodGhpcy5oYXNMb2dnZXIoKSkgdGhpcy5sb2coXCJ0cmFuc3BvcnRcIiwgYGNvbm5lY3RlZCB0byAke3RoaXMuZW5kUG9pbnRVUkwoKX1gKVxuICAgIHRoaXMuY2xvc2VXYXNDbGVhbiA9IGZhbHNlXG4gICAgdGhpcy5lc3RhYmxpc2hlZENvbm5lY3Rpb25zKytcbiAgICB0aGlzLmZsdXNoU2VuZEJ1ZmZlcigpXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lci5yZXNldCgpXG4gICAgdGhpcy5yZXNldEhlYXJ0YmVhdCgpXG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5vcGVuLmZvckVhY2goKFssIGNhbGxiYWNrXSkgPT4gY2FsbGJhY2soKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBoZWFydGJlYXRUaW1lb3V0KCl7XG4gICAgaWYodGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmKXtcbiAgICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGxcbiAgICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpeyB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBcImhlYXJ0YmVhdCB0aW1lb3V0LiBBdHRlbXB0aW5nIHRvIHJlLWVzdGFibGlzaCBjb25uZWN0aW9uXCIpIH1cbiAgICAgIHRoaXMuYWJub3JtYWxDbG9zZShcImhlYXJ0YmVhdCB0aW1lb3V0XCIpXG4gICAgfVxuICB9XG5cbiAgcmVzZXRIZWFydGJlYXQoKXtcbiAgICBpZih0aGlzLmNvbm4gJiYgdGhpcy5jb25uLnNraXBIZWFydGJlYXQpeyByZXR1cm4gfVxuICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGxcbiAgICBjbGVhclRpbWVvdXQodGhpcy5oZWFydGJlYXRUaW1lcilcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VuZEhlYXJ0YmVhdCgpLCB0aGlzLmhlYXJ0YmVhdEludGVydmFsTXMpXG4gIH1cblxuICB0ZWFyZG93bihjYWxsYmFjaywgY29kZSwgcmVhc29uKXtcbiAgICBpZighdGhpcy5jb25uKXtcbiAgICAgIHJldHVybiBjYWxsYmFjayAmJiBjYWxsYmFjaygpXG4gICAgfVxuXG4gICAgdGhpcy53YWl0Rm9yQnVmZmVyRG9uZSgoKSA9PiB7XG4gICAgICBpZih0aGlzLmNvbm4pe1xuICAgICAgICBpZihjb2RlKXsgdGhpcy5jb25uLmNsb3NlKGNvZGUsIHJlYXNvbiB8fCBcIlwiKSB9IGVsc2UgeyB0aGlzLmNvbm4uY2xvc2UoKSB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMud2FpdEZvclNvY2tldENsb3NlZCgoKSA9PiB7XG4gICAgICAgIGlmKHRoaXMuY29ubil7XG4gICAgICAgICAgdGhpcy5jb25uLm9uY2xvc2UgPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgICAgICAgdGhpcy5jb25uID0gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgd2FpdEZvckJ1ZmZlckRvbmUoY2FsbGJhY2ssIHRyaWVzID0gMSl7XG4gICAgaWYodHJpZXMgPT09IDUgfHwgIXRoaXMuY29ubiB8fCAhdGhpcy5jb25uLmJ1ZmZlcmVkQW1vdW50KXtcbiAgICAgIGNhbGxiYWNrKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy53YWl0Rm9yQnVmZmVyRG9uZShjYWxsYmFjaywgdHJpZXMgKyAxKVxuICAgIH0sIDE1MCAqIHRyaWVzKVxuICB9XG5cbiAgd2FpdEZvclNvY2tldENsb3NlZChjYWxsYmFjaywgdHJpZXMgPSAxKXtcbiAgICBpZih0cmllcyA9PT0gNSB8fCAhdGhpcy5jb25uIHx8IHRoaXMuY29ubi5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLmNsb3NlZCl7XG4gICAgICBjYWxsYmFjaygpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMud2FpdEZvclNvY2tldENsb3NlZChjYWxsYmFjaywgdHJpZXMgKyAxKVxuICAgIH0sIDE1MCAqIHRyaWVzKVxuICB9XG5cbiAgb25Db25uQ2xvc2UoZXZlbnQpe1xuICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIFwiY2xvc2VcIiwgZXZlbnQpXG4gICAgdGhpcy50cmlnZ2VyQ2hhbkVycm9yKClcbiAgICBjbGVhclRpbWVvdXQodGhpcy5oZWFydGJlYXRUaW1lcilcbiAgICBpZighdGhpcy5jbG9zZVdhc0NsZWFuKXtcbiAgICAgIHRoaXMucmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KClcbiAgICB9XG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5jbG9zZS5mb3JFYWNoKChbLCBjYWxsYmFja10pID0+IGNhbGxiYWNrKGV2ZW50KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25Db25uRXJyb3IoZXJyb3Ipe1xuICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGVycm9yKVxuICAgIGxldCB0cmFuc3BvcnRCZWZvcmUgPSB0aGlzLnRyYW5zcG9ydFxuICAgIGxldCBlc3RhYmxpc2hlZEJlZm9yZSA9IHRoaXMuZXN0YWJsaXNoZWRDb25uZWN0aW9uc1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MuZXJyb3IuZm9yRWFjaCgoWywgY2FsbGJhY2tdKSA9PiB7XG4gICAgICBjYWxsYmFjayhlcnJvciwgdHJhbnNwb3J0QmVmb3JlLCBlc3RhYmxpc2hlZEJlZm9yZSlcbiAgICB9KVxuICAgIGlmKHRyYW5zcG9ydEJlZm9yZSA9PT0gdGhpcy50cmFuc3BvcnQgfHwgZXN0YWJsaXNoZWRCZWZvcmUgPiAwKXtcbiAgICAgIHRoaXMudHJpZ2dlckNoYW5FcnJvcigpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmlnZ2VyQ2hhbkVycm9yKCl7XG4gICAgdGhpcy5jaGFubmVscy5mb3JFYWNoKGNoYW5uZWwgPT4ge1xuICAgICAgaWYoIShjaGFubmVsLmlzRXJyb3JlZCgpIHx8IGNoYW5uZWwuaXNMZWF2aW5nKCkgfHwgY2hhbm5lbC5pc0Nsb3NlZCgpKSl7XG4gICAgICAgIGNoYW5uZWwudHJpZ2dlcihDSEFOTkVMX0VWRU5UUy5lcnJvcilcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBjb25uZWN0aW9uU3RhdGUoKXtcbiAgICBzd2l0Y2godGhpcy5jb25uICYmIHRoaXMuY29ubi5yZWFkeVN0YXRlKXtcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5jb25uZWN0aW5nOiByZXR1cm4gXCJjb25uZWN0aW5nXCJcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5vcGVuOiByZXR1cm4gXCJvcGVuXCJcbiAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5jbG9zaW5nOiByZXR1cm4gXCJjbG9zaW5nXCJcbiAgICAgIGRlZmF1bHQ6IHJldHVybiBcImNsb3NlZFwiXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNDb25uZWN0ZWQoKXsgcmV0dXJuIHRoaXMuY29ubmVjdGlvblN0YXRlKCkgPT09IFwib3BlblwiIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICpcbiAgICogQHBhcmFtIHtDaGFubmVsfVxuICAgKi9cbiAgcmVtb3ZlKGNoYW5uZWwpe1xuICAgIHRoaXMub2ZmKGNoYW5uZWwuc3RhdGVDaGFuZ2VSZWZzKVxuICAgIHRoaXMuY2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzLmZpbHRlcihjID0+IGMuam9pblJlZigpICE9PSBjaGFubmVsLmpvaW5SZWYoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGBvbk9wZW5gLCBgb25DbG9zZWAsIGBvbkVycm9yLGAgYW5kIGBvbk1lc3NhZ2VgIHJlZ2lzdHJhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7cmVmc30gLSBsaXN0IG9mIHJlZnMgcmV0dXJuZWQgYnkgY2FsbHMgdG9cbiAgICogICAgICAgICAgICAgICAgIGBvbk9wZW5gLCBgb25DbG9zZWAsIGBvbkVycm9yLGAgYW5kIGBvbk1lc3NhZ2VgXG4gICAqL1xuICBvZmYocmVmcyl7XG4gICAgZm9yKGxldCBrZXkgaW4gdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcyl7XG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzW2tleV0gPSB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzW2tleV0uZmlsdGVyKChbcmVmXSkgPT4ge1xuICAgICAgICByZXR1cm4gcmVmcy5pbmRleE9mKHJlZikgPT09IC0xXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZXMgYSBuZXcgY2hhbm5lbCBmb3IgdGhlIGdpdmVuIHRvcGljXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b3BpY1xuICAgKiBAcGFyYW0ge09iamVjdH0gY2hhblBhcmFtcyAtIFBhcmFtZXRlcnMgZm9yIHRoZSBjaGFubmVsXG4gICAqIEByZXR1cm5zIHtDaGFubmVsfVxuICAgKi9cbiAgY2hhbm5lbCh0b3BpYywgY2hhblBhcmFtcyA9IHt9KXtcbiAgICBsZXQgY2hhbiA9IG5ldyBDaGFubmVsKHRvcGljLCBjaGFuUGFyYW1zLCB0aGlzKVxuICAgIHRoaXMuY2hhbm5lbHMucHVzaChjaGFuKVxuICAgIHJldHVybiBjaGFuXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICovXG4gIHB1c2goZGF0YSl7XG4gICAgaWYodGhpcy5oYXNMb2dnZXIoKSl7XG4gICAgICBsZXQge3RvcGljLCBldmVudCwgcGF5bG9hZCwgcmVmLCBqb2luX3JlZn0gPSBkYXRhXG4gICAgICB0aGlzLmxvZyhcInB1c2hcIiwgYCR7dG9waWN9ICR7ZXZlbnR9ICgke2pvaW5fcmVmfSwgJHtyZWZ9KWAsIHBheWxvYWQpXG4gICAgfVxuXG4gICAgaWYodGhpcy5pc0Nvbm5lY3RlZCgpKXtcbiAgICAgIHRoaXMuZW5jb2RlKGRhdGEsIHJlc3VsdCA9PiB0aGlzLmNvbm4uc2VuZChyZXN1bHQpKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbmRCdWZmZXIucHVzaCgoKSA9PiB0aGlzLmVuY29kZShkYXRhLCByZXN1bHQgPT4gdGhpcy5jb25uLnNlbmQocmVzdWx0KSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgbmV4dCBtZXNzYWdlIHJlZiwgYWNjb3VudGluZyBmb3Igb3ZlcmZsb3dzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBtYWtlUmVmKCl7XG4gICAgbGV0IG5ld1JlZiA9IHRoaXMucmVmICsgMVxuICAgIGlmKG5ld1JlZiA9PT0gdGhpcy5yZWYpeyB0aGlzLnJlZiA9IDAgfSBlbHNlIHsgdGhpcy5yZWYgPSBuZXdSZWYgfVxuXG4gICAgcmV0dXJuIHRoaXMucmVmLnRvU3RyaW5nKClcbiAgfVxuXG4gIHNlbmRIZWFydGJlYXQoKXtcbiAgICBpZih0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYgJiYgIXRoaXMuaXNDb25uZWN0ZWQoKSl7IHJldHVybiB9XG4gICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gdGhpcy5tYWtlUmVmKClcbiAgICB0aGlzLnB1c2goe3RvcGljOiBcInBob2VuaXhcIiwgZXZlbnQ6IFwiaGVhcnRiZWF0XCIsIHBheWxvYWQ6IHt9LCByZWY6IHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZn0pXG4gICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5oZWFydGJlYXRUaW1lb3V0KCksIHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxNcylcbiAgfVxuXG4gIGFibm9ybWFsQ2xvc2UocmVhc29uKXtcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgIGlmKHRoaXMuaXNDb25uZWN0ZWQoKSl7IHRoaXMuY29ubi5jbG9zZShXU19DTE9TRV9OT1JNQUwsIHJlYXNvbikgfVxuICB9XG5cbiAgZmx1c2hTZW5kQnVmZmVyKCl7XG4gICAgaWYodGhpcy5pc0Nvbm5lY3RlZCgpICYmIHRoaXMuc2VuZEJ1ZmZlci5sZW5ndGggPiAwKXtcbiAgICAgIHRoaXMuc2VuZEJ1ZmZlci5mb3JFYWNoKGNhbGxiYWNrID0+IGNhbGxiYWNrKCkpXG4gICAgICB0aGlzLnNlbmRCdWZmZXIgPSBbXVxuICAgIH1cbiAgfVxuXG4gIG9uQ29ubk1lc3NhZ2UocmF3TWVzc2FnZSl7XG4gICAgdGhpcy5kZWNvZGUocmF3TWVzc2FnZS5kYXRhLCBtc2cgPT4ge1xuICAgICAgbGV0IHt0b3BpYywgZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pbl9yZWZ9ID0gbXNnXG4gICAgICBpZihyZWYgJiYgcmVmID09PSB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYpe1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5oZWFydGJlYXRUaW1lcilcbiAgICAgICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gbnVsbFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VuZEhlYXJ0YmVhdCgpLCB0aGlzLmhlYXJ0YmVhdEludGVydmFsTXMpXG4gICAgICB9XG5cbiAgICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpIHRoaXMubG9nKFwicmVjZWl2ZVwiLCBgJHtwYXlsb2FkLnN0YXR1cyB8fCBcIlwifSAke3RvcGljfSAke2V2ZW50fSAke3JlZiAmJiBcIihcIiArIHJlZiArIFwiKVwiIHx8IFwiXCJ9YCwgcGF5bG9hZClcblxuICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHRoaXMuY2hhbm5lbHMubGVuZ3RoOyBpKyspe1xuICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5jaGFubmVsc1tpXVxuICAgICAgICBpZighY2hhbm5lbC5pc01lbWJlcih0b3BpYywgZXZlbnQsIHBheWxvYWQsIGpvaW5fcmVmKSl7IGNvbnRpbnVlIH1cbiAgICAgICAgY2hhbm5lbC50cmlnZ2VyKGV2ZW50LCBwYXlsb2FkLCByZWYsIGpvaW5fcmVmKVxuICAgICAgfVxuXG4gICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5tZXNzYWdlLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgbGV0IFssIGNhbGxiYWNrXSA9IHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MubWVzc2FnZVtpXVxuICAgICAgICBjYWxsYmFjayhtc2cpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGxlYXZlT3BlblRvcGljKHRvcGljKXtcbiAgICBsZXQgZHVwQ2hhbm5lbCA9IHRoaXMuY2hhbm5lbHMuZmluZChjID0+IGMudG9waWMgPT09IHRvcGljICYmIChjLmlzSm9pbmVkKCkgfHwgYy5pc0pvaW5pbmcoKSkpXG4gICAgaWYoZHVwQ2hhbm5lbCl7XG4gICAgICBpZih0aGlzLmhhc0xvZ2dlcigpKSB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBgbGVhdmluZyBkdXBsaWNhdGUgdG9waWMgXCIke3RvcGljfVwiYClcbiAgICAgIGR1cENoYW5uZWwubGVhdmUoKVxuICAgIH1cbiAgfVxufVxuIiwgIlxuZXhwb3J0IGNvbnN0IENPTlNFQ1VUSVZFX1JFTE9BRFMgPSBcImNvbnNlY3V0aXZlLXJlbG9hZHNcIlxuZXhwb3J0IGNvbnN0IE1BWF9SRUxPQURTID0gMTBcbmV4cG9ydCBjb25zdCBSRUxPQURfSklUVEVSID0gWzEwMDAsIDMwMDBdXG5leHBvcnQgY29uc3QgRkFJTFNBRkVfSklUVEVSID0gMzAwMDBcbmV4cG9ydCBjb25zdCBQSFhfRVZFTlRfQ0xBU1NFUyA9IFtcbiAgXCJwaHgtY2xpY2stbG9hZGluZ1wiLCBcInBoeC1jaGFuZ2UtbG9hZGluZ1wiLCBcInBoeC1zdWJtaXQtbG9hZGluZ1wiLFxuICBcInBoeC1rZXlkb3duLWxvYWRpbmdcIiwgXCJwaHgta2V5dXAtbG9hZGluZ1wiLCBcInBoeC1ibHVyLWxvYWRpbmdcIiwgXCJwaHgtZm9jdXMtbG9hZGluZ1wiXG5dXG5leHBvcnQgY29uc3QgUEhYX0NPTVBPTkVOVCA9IFwiZGF0YS1waHgtY29tcG9uZW50XCJcbmV4cG9ydCBjb25zdCBQSFhfTElWRV9MSU5LID0gXCJkYXRhLXBoeC1saW5rXCJcbmV4cG9ydCBjb25zdCBQSFhfVFJBQ0tfU1RBVElDID0gXCJ0cmFjay1zdGF0aWNcIlxuZXhwb3J0IGNvbnN0IFBIWF9MSU5LX1NUQVRFID0gXCJkYXRhLXBoeC1saW5rLXN0YXRlXCJcbmV4cG9ydCBjb25zdCBQSFhfUkVGID0gXCJkYXRhLXBoeC1yZWZcIlxuZXhwb3J0IGNvbnN0IFBIWF9UUkFDS19VUExPQURTID0gXCJ0cmFjay11cGxvYWRzXCJcbmV4cG9ydCBjb25zdCBQSFhfVVBMT0FEX1JFRiA9IFwiZGF0YS1waHgtdXBsb2FkLXJlZlwiXG5leHBvcnQgY29uc3QgUEhYX1BSRUZMSUdIVEVEX1JFRlMgPSBcImRhdGEtcGh4LXByZWZsaWdodGVkLXJlZnNcIlxuZXhwb3J0IGNvbnN0IFBIWF9ET05FX1JFRlMgPSBcImRhdGEtcGh4LWRvbmUtcmVmc1wiXG5leHBvcnQgY29uc3QgUEhYX0RST1BfVEFSR0VUID0gXCJkcm9wLXRhcmdldFwiXG5leHBvcnQgY29uc3QgUEhYX0FDVElWRV9FTlRSWV9SRUZTID0gXCJkYXRhLXBoeC1hY3RpdmUtcmVmc1wiXG5leHBvcnQgY29uc3QgUEhYX0xJVkVfRklMRV9VUERBVEVEID0gXCJwaHg6bGl2ZS1maWxlOnVwZGF0ZWRcIlxuZXhwb3J0IGNvbnN0IFBIWF9TS0lQID0gXCJkYXRhLXBoeC1za2lwXCJcbmV4cG9ydCBjb25zdCBQSFhfUkVNT1ZFID0gXCJkYXRhLXBoeC1yZW1vdmVcIlxuZXhwb3J0IGNvbnN0IFBIWF9QQUdFX0xPQURJTkcgPSBcInBhZ2UtbG9hZGluZ1wiXG5leHBvcnQgY29uc3QgUEhYX0NPTk5FQ1RFRF9DTEFTUyA9IFwicGh4LWNvbm5lY3RlZFwiXG5leHBvcnQgY29uc3QgUEhYX0RJU0NPTk5FQ1RFRF9DTEFTUyA9IFwicGh4LWRpc2Nvbm5lY3RlZFwiXG5leHBvcnQgY29uc3QgUEhYX05PX0ZFRURCQUNLX0NMQVNTID0gXCJwaHgtbm8tZmVlZGJhY2tcIlxuZXhwb3J0IGNvbnN0IFBIWF9FUlJPUl9DTEFTUyA9IFwicGh4LWVycm9yXCJcbmV4cG9ydCBjb25zdCBQSFhfUEFSRU5UX0lEID0gXCJkYXRhLXBoeC1wYXJlbnQtaWRcIlxuZXhwb3J0IGNvbnN0IFBIWF9NQUlOID0gXCJkYXRhLXBoeC1tYWluXCJcbmV4cG9ydCBjb25zdCBQSFhfUk9PVF9JRCA9IFwiZGF0YS1waHgtcm9vdC1pZFwiXG5leHBvcnQgY29uc3QgUEhYX1RSSUdHRVJfQUNUSU9OID0gXCJ0cmlnZ2VyLWFjdGlvblwiXG5leHBvcnQgY29uc3QgUEhYX0ZFRURCQUNLX0ZPUiA9IFwiZmVlZGJhY2stZm9yXCJcbmV4cG9ydCBjb25zdCBQSFhfSEFTX0ZPQ1VTRUQgPSBcInBoeC1oYXMtZm9jdXNlZFwiXG5leHBvcnQgY29uc3QgRk9DVVNBQkxFX0lOUFVUUyA9IFtcInRleHRcIiwgXCJ0ZXh0YXJlYVwiLCBcIm51bWJlclwiLCBcImVtYWlsXCIsIFwicGFzc3dvcmRcIiwgXCJzZWFyY2hcIiwgXCJ0ZWxcIiwgXCJ1cmxcIiwgXCJkYXRlXCIsIFwidGltZVwiXVxuZXhwb3J0IGNvbnN0IENIRUNLQUJMRV9JTlBVVFMgPSBbXCJjaGVja2JveFwiLCBcInJhZGlvXCJdXG5leHBvcnQgY29uc3QgUEhYX0hBU19TVUJNSVRURUQgPSBcInBoeC1oYXMtc3VibWl0dGVkXCJcbmV4cG9ydCBjb25zdCBQSFhfU0VTU0lPTiA9IFwiZGF0YS1waHgtc2Vzc2lvblwiXG5leHBvcnQgY29uc3QgUEhYX1ZJRVdfU0VMRUNUT1IgPSBgWyR7UEhYX1NFU1NJT059XWBcbmV4cG9ydCBjb25zdCBQSFhfU1RBVElDID0gXCJkYXRhLXBoeC1zdGF0aWNcIlxuZXhwb3J0IGNvbnN0IFBIWF9SRUFET05MWSA9IFwiZGF0YS1waHgtcmVhZG9ubHlcIlxuZXhwb3J0IGNvbnN0IFBIWF9ESVNBQkxFRCA9IFwiZGF0YS1waHgtZGlzYWJsZWRcIlxuZXhwb3J0IGNvbnN0IFBIWF9ESVNBQkxFX1dJVEggPSBcImRpc2FibGUtd2l0aFwiXG5leHBvcnQgY29uc3QgUEhYX0RJU0FCTEVfV0lUSF9SRVNUT1JFID0gXCJkYXRhLXBoeC1kaXNhYmxlLXdpdGgtcmVzdG9yZVwiXG5leHBvcnQgY29uc3QgUEhYX0hPT0sgPSBcImhvb2tcIlxuZXhwb3J0IGNvbnN0IFBIWF9ERUJPVU5DRSA9IFwiZGVib3VuY2VcIlxuZXhwb3J0IGNvbnN0IFBIWF9USFJPVFRMRSA9IFwidGhyb3R0bGVcIlxuZXhwb3J0IGNvbnN0IFBIWF9VUERBVEUgPSBcInVwZGF0ZVwiXG5leHBvcnQgY29uc3QgUEhYX0tFWSA9IFwia2V5XCJcbmV4cG9ydCBjb25zdCBQSFhfUFJJVkFURSA9IFwicGh4UHJpdmF0ZVwiXG5leHBvcnQgY29uc3QgUEhYX0FVVE9fUkVDT1ZFUiA9IFwiYXV0by1yZWNvdmVyXCJcbmV4cG9ydCBjb25zdCBQSFhfTFZfREVCVUcgPSBcInBoeDpsaXZlLXNvY2tldDpkZWJ1Z1wiXG5leHBvcnQgY29uc3QgUEhYX0xWX1BST0ZJTEUgPSBcInBoeDpsaXZlLXNvY2tldDpwcm9maWxpbmdcIlxuZXhwb3J0IGNvbnN0IFBIWF9MVl9MQVRFTkNZX1NJTSA9IFwicGh4OmxpdmUtc29ja2V0OmxhdGVuY3ktc2ltXCJcbmV4cG9ydCBjb25zdCBQSFhfUFJPR1JFU1MgPSBcInByb2dyZXNzXCJcbmV4cG9ydCBjb25zdCBMT0FERVJfVElNRU9VVCA9IDFcbmV4cG9ydCBjb25zdCBCRUZPUkVfVU5MT0FEX0xPQURFUl9USU1FT1VUID0gMjAwXG5leHBvcnQgY29uc3QgQklORElOR19QUkVGSVggPSBcInBoeC1cIlxuZXhwb3J0IGNvbnN0IFBVU0hfVElNRU9VVCA9IDMwMDAwXG5leHBvcnQgY29uc3QgTElOS19IRUFERVIgPSBcIngtcmVxdWVzdGVkLXdpdGhcIlxuZXhwb3J0IGNvbnN0IFJFU1BPTlNFX1VSTF9IRUFERVIgPSBcIngtcmVzcG9uc2UtdXJsXCJcbmV4cG9ydCBjb25zdCBERUJPVU5DRV9UUklHR0VSID0gXCJkZWJvdW5jZS10cmlnZ2VyXCJcbmV4cG9ydCBjb25zdCBUSFJPVFRMRUQgPSBcInRocm90dGxlZFwiXG5leHBvcnQgY29uc3QgREVCT1VOQ0VfUFJFVl9LRVkgPSBcImRlYm91bmNlLXByZXYta2V5XCJcbmV4cG9ydCBjb25zdCBERUZBVUxUUyA9IHtcbiAgZGVib3VuY2U6IDMwMCxcbiAgdGhyb3R0bGU6IDMwMFxufVxuXG4vLyBSZW5kZXJlZFxuZXhwb3J0IGNvbnN0IERZTkFNSUNTID0gXCJkXCJcbmV4cG9ydCBjb25zdCBTVEFUSUMgPSBcInNcIlxuZXhwb3J0IGNvbnN0IENPTVBPTkVOVFMgPSBcImNcIlxuZXhwb3J0IGNvbnN0IEVWRU5UUyA9IFwiZVwiXG5leHBvcnQgY29uc3QgUkVQTFkgPSBcInJcIlxuZXhwb3J0IGNvbnN0IFRJVExFID0gXCJ0XCJcbiIsICJpbXBvcnQge1xuICBsb2dFcnJvclxufSBmcm9tIFwiLi91dGlsc1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVudHJ5VXBsb2FkZXIge1xuICBjb25zdHJ1Y3RvcihlbnRyeSwgY2h1bmtTaXplLCBsaXZlU29ja2V0KXtcbiAgICB0aGlzLmxpdmVTb2NrZXQgPSBsaXZlU29ja2V0XG4gICAgdGhpcy5lbnRyeSA9IGVudHJ5XG4gICAgdGhpcy5vZmZzZXQgPSAwXG4gICAgdGhpcy5jaHVua1NpemUgPSBjaHVua1NpemVcbiAgICB0aGlzLmNodW5rVGltZXIgPSBudWxsXG4gICAgdGhpcy51cGxvYWRDaGFubmVsID0gbGl2ZVNvY2tldC5jaGFubmVsKGBsdnU6JHtlbnRyeS5yZWZ9YCwge3Rva2VuOiBlbnRyeS5tZXRhZGF0YSgpfSlcbiAgfVxuXG4gIGVycm9yKHJlYXNvbil7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuY2h1bmtUaW1lcilcbiAgICB0aGlzLnVwbG9hZENoYW5uZWwubGVhdmUoKVxuICAgIHRoaXMuZW50cnkuZXJyb3IocmVhc29uKVxuICB9XG5cbiAgdXBsb2FkKCl7XG4gICAgdGhpcy51cGxvYWRDaGFubmVsLm9uRXJyb3IocmVhc29uID0+IHRoaXMuZXJyb3IocmVhc29uKSlcbiAgICB0aGlzLnVwbG9hZENoYW5uZWwuam9pbigpXG4gICAgICAucmVjZWl2ZShcIm9rXCIsIF9kYXRhID0+IHRoaXMucmVhZE5leHRDaHVuaygpKVxuICAgICAgLnJlY2VpdmUoXCJlcnJvclwiLCByZWFzb24gPT4gdGhpcy5lcnJvcihyZWFzb24pKVxuICB9XG5cbiAgaXNEb25lKCl7IHJldHVybiB0aGlzLm9mZnNldCA+PSB0aGlzLmVudHJ5LmZpbGUuc2l6ZSB9XG5cbiAgcmVhZE5leHRDaHVuaygpe1xuICAgIGxldCByZWFkZXIgPSBuZXcgd2luZG93LkZpbGVSZWFkZXIoKVxuICAgIGxldCBibG9iID0gdGhpcy5lbnRyeS5maWxlLnNsaWNlKHRoaXMub2Zmc2V0LCB0aGlzLmNodW5rU2l6ZSArIHRoaXMub2Zmc2V0KVxuICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xuICAgICAgaWYoZS50YXJnZXQuZXJyb3IgPT09IG51bGwpe1xuICAgICAgICB0aGlzLm9mZnNldCArPSBlLnRhcmdldC5yZXN1bHQuYnl0ZUxlbmd0aFxuICAgICAgICB0aGlzLnB1c2hDaHVuayhlLnRhcmdldC5yZXN1bHQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbG9nRXJyb3IoXCJSZWFkIGVycm9yOiBcIiArIGUudGFyZ2V0LmVycm9yKVxuICAgICAgfVxuICAgIH1cbiAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYilcbiAgfVxuXG4gIHB1c2hDaHVuayhjaHVuayl7XG4gICAgaWYoIXRoaXMudXBsb2FkQ2hhbm5lbC5pc0pvaW5lZCgpKXsgcmV0dXJuIH1cbiAgICB0aGlzLnVwbG9hZENoYW5uZWwucHVzaChcImNodW5rXCIsIGNodW5rKVxuICAgICAgLnJlY2VpdmUoXCJva1wiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuZW50cnkucHJvZ3Jlc3MoKHRoaXMub2Zmc2V0IC8gdGhpcy5lbnRyeS5maWxlLnNpemUpICogMTAwKVxuICAgICAgICBpZighdGhpcy5pc0RvbmUoKSl7XG4gICAgICAgICAgdGhpcy5jaHVua1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlYWROZXh0Q2h1bmsoKSwgdGhpcy5saXZlU29ja2V0LmdldExhdGVuY3lTaW0oKSB8fCAwKVxuICAgICAgICB9XG4gICAgICB9KVxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgUEhYX1ZJRVdfU0VMRUNUT1Jcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IEVudHJ5VXBsb2FkZXIgZnJvbSBcIi4vZW50cnlfdXBsb2FkZXJcIlxuXG5leHBvcnQgbGV0IGxvZ0Vycm9yID0gKG1zZywgb2JqKSA9PiBjb25zb2xlLmVycm9yICYmIGNvbnNvbGUuZXJyb3IobXNnLCBvYmopXG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3REdXBsaWNhdGVJZHMoKXtcbiAgbGV0IGlkcyA9IG5ldyBTZXQoKVxuICBsZXQgZWxlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiKltpZF1cIilcbiAgZm9yKGxldCBpID0gMCwgbGVuID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspe1xuICAgIGlmKGlkcy5oYXMoZWxlbXNbaV0uaWQpKXtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYE11bHRpcGxlIElEcyBkZXRlY3RlZDogJHtlbGVtc1tpXS5pZH0uIEVuc3VyZSB1bmlxdWUgZWxlbWVudCBpZHMuYClcbiAgICB9IGVsc2Uge1xuICAgICAgaWRzLmFkZChlbGVtc1tpXS5pZClcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGxldCBkZWJ1ZyA9ICh2aWV3LCBraW5kLCBtc2csIG9iaikgPT4ge1xuICBpZih2aWV3LmxpdmVTb2NrZXQuaXNEZWJ1Z0VuYWJsZWQoKSl7XG4gICAgY29uc29sZS5sb2coYCR7dmlldy5pZH0gJHtraW5kfTogJHttc2d9IC0gYCwgb2JqKVxuICB9XG59XG5cbi8vIHdyYXBzIHZhbHVlIGluIGNsb3N1cmUgb3IgcmV0dXJucyBjbG9zdXJlXG5leHBvcnQgbGV0IGNsb3N1cmUgPSAodmFsKSA9PiB0eXBlb2YgdmFsID09PSBcImZ1bmN0aW9uXCIgPyB2YWwgOiBmdW5jdGlvbiAoKXsgcmV0dXJuIHZhbCB9XG5cbmV4cG9ydCBsZXQgY2xvbmUgPSAob2JqKSA9PiB7IHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpIH1cblxuZXhwb3J0IGxldCBjbG9zZXN0UGh4QmluZGluZyA9IChlbCwgYmluZGluZywgYm9yZGVyRWwpID0+IHtcbiAgZG8ge1xuICAgIGlmKGVsLm1hdGNoZXMoYFske2JpbmRpbmd9XWApKXsgcmV0dXJuIGVsIH1cbiAgICBlbCA9IGVsLnBhcmVudEVsZW1lbnQgfHwgZWwucGFyZW50Tm9kZVxuICB9IHdoaWxlKGVsICE9PSBudWxsICYmIGVsLm5vZGVUeXBlID09PSAxICYmICEoKGJvcmRlckVsICYmIGJvcmRlckVsLmlzU2FtZU5vZGUoZWwpKSB8fCBlbC5tYXRjaGVzKFBIWF9WSUVXX1NFTEVDVE9SKSkpXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBsZXQgaXNPYmplY3QgPSAob2JqKSA9PiB7XG4gIHJldHVybiBvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiAmJiAhKG9iaiBpbnN0YW5jZW9mIEFycmF5KVxufVxuXG5leHBvcnQgbGV0IGlzRXF1YWxPYmogPSAob2JqMSwgb2JqMikgPT4gSlNPTi5zdHJpbmdpZnkob2JqMSkgPT09IEpTT04uc3RyaW5naWZ5KG9iajIpXG5cbmV4cG9ydCBsZXQgaXNFbXB0eSA9IChvYmopID0+IHtcbiAgZm9yKGxldCB4IGluIG9iail7IHJldHVybiBmYWxzZSB9XG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBsZXQgbWF5YmUgPSAoZWwsIGNhbGxiYWNrKSA9PiBlbCAmJiBjYWxsYmFjayhlbClcblxuZXhwb3J0IGxldCBjaGFubmVsVXBsb2FkZXIgPSBmdW5jdGlvbiAoZW50cmllcywgb25FcnJvciwgcmVzcCwgbGl2ZVNvY2tldCl7XG4gIGVudHJpZXMuZm9yRWFjaChlbnRyeSA9PiB7XG4gICAgbGV0IGVudHJ5VXBsb2FkZXIgPSBuZXcgRW50cnlVcGxvYWRlcihlbnRyeSwgcmVzcC5jb25maWcuY2h1bmtfc2l6ZSwgbGl2ZVNvY2tldClcbiAgICBlbnRyeVVwbG9hZGVyLnVwbG9hZCgpXG4gIH0pXG59XG4iLCAibGV0IEJyb3dzZXIgPSB7XG4gIGNhblB1c2hTdGF0ZSgpeyByZXR1cm4gKHR5cGVvZiAoaGlzdG9yeS5wdXNoU3RhdGUpICE9PSBcInVuZGVmaW5lZFwiKSB9LFxuXG4gIGRyb3BMb2NhbChsb2NhbFN0b3JhZ2UsIG5hbWVzcGFjZSwgc3Via2V5KXtcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5sb2NhbEtleShuYW1lc3BhY2UsIHN1YmtleSkpXG4gIH0sXG5cbiAgdXBkYXRlTG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSwgaW5pdGlhbCwgZnVuYyl7XG4gICAgbGV0IGN1cnJlbnQgPSB0aGlzLmdldExvY2FsKGxvY2FsU3RvcmFnZSwgbmFtZXNwYWNlLCBzdWJrZXkpXG4gICAgbGV0IGtleSA9IHRoaXMubG9jYWxLZXkobmFtZXNwYWNlLCBzdWJrZXkpXG4gICAgbGV0IG5ld1ZhbCA9IGN1cnJlbnQgPT09IG51bGwgPyBpbml0aWFsIDogZnVuYyhjdXJyZW50KVxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkobmV3VmFsKSlcbiAgICByZXR1cm4gbmV3VmFsXG4gIH0sXG5cbiAgZ2V0TG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSl7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5sb2NhbEtleShuYW1lc3BhY2UsIHN1YmtleSkpKVxuICB9LFxuXG4gIHVwZGF0ZUN1cnJlbnRTdGF0ZShjYWxsYmFjayl7XG4gICAgaWYoIXRoaXMuY2FuUHVzaFN0YXRlKCkpeyByZXR1cm4gfVxuICAgIGhpc3RvcnkucmVwbGFjZVN0YXRlKGNhbGxiYWNrKGhpc3Rvcnkuc3RhdGUgfHwge30pLCBcIlwiLCB3aW5kb3cubG9jYXRpb24uaHJlZilcbiAgfSxcblxuICBwdXNoU3RhdGUoa2luZCwgbWV0YSwgdG8pe1xuICAgIGlmKHRoaXMuY2FuUHVzaFN0YXRlKCkpe1xuICAgICAgaWYodG8gIT09IHdpbmRvdy5sb2NhdGlvbi5ocmVmKXtcbiAgICAgICAgaWYobWV0YS50eXBlID09IFwicmVkaXJlY3RcIiAmJiBtZXRhLnNjcm9sbCl7XG4gICAgICAgICAgLy8gSWYgd2UncmUgcmVkaXJlY3Rpbmcgc3RvcmUgdGhlIGN1cnJlbnQgc2Nyb2xsWSBmb3IgdGhlIGN1cnJlbnQgaGlzdG9yeSBzdGF0ZS5cbiAgICAgICAgICBsZXQgY3VycmVudFN0YXRlID0gaGlzdG9yeS5zdGF0ZSB8fCB7fVxuICAgICAgICAgIGN1cnJlbnRTdGF0ZS5zY3JvbGwgPSBtZXRhLnNjcm9sbFxuICAgICAgICAgIGhpc3RvcnkucmVwbGFjZVN0YXRlKGN1cnJlbnRTdGF0ZSwgXCJcIiwgd2luZG93LmxvY2F0aW9uLmhyZWYpXG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgbWV0YS5zY3JvbGwgLy8gT25seSBzdG9yZSB0aGUgc2Nyb2xsIGluIHRoZSByZWRpcmVjdCBjYXNlLlxuICAgICAgICBoaXN0b3J5W2tpbmQgKyBcIlN0YXRlXCJdKG1ldGEsIFwiXCIsIHRvIHx8IG51bGwpIC8vIElFIHdpbGwgY29lcmNlIHVuZGVmaW5lZCB0byBzdHJpbmdcbiAgICAgICAgbGV0IGhhc2hFbCA9IHRoaXMuZ2V0SGFzaFRhcmdldEVsKHdpbmRvdy5sb2NhdGlvbi5oYXNoKVxuXG4gICAgICAgIGlmKGhhc2hFbCl7XG4gICAgICAgICAgaGFzaEVsLnNjcm9sbEludG9WaWV3KClcbiAgICAgICAgfSBlbHNlIGlmKG1ldGEudHlwZSA9PT0gXCJyZWRpcmVjdFwiKXtcbiAgICAgICAgICB3aW5kb3cuc2Nyb2xsKDAsIDApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWRpcmVjdCh0bylcbiAgICB9XG4gIH0sXG5cbiAgc2V0Q29va2llKG5hbWUsIHZhbHVlKXtcbiAgICBkb2N1bWVudC5jb29raWUgPSBgJHtuYW1lfT0ke3ZhbHVlfWBcbiAgfSxcblxuICBnZXRDb29raWUobmFtZSl7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNvb2tpZS5yZXBsYWNlKG5ldyBSZWdFeHAoYCg/Oig/Ol58Lio7XFxzKikke25hbWV9XFxzKlxcPVxccyooW147XSopLiokKXxeLiokYCksIFwiJDFcIilcbiAgfSxcblxuICByZWRpcmVjdCh0b1VSTCwgZmxhc2gpe1xuICAgIGlmKGZsYXNoKXsgQnJvd3Nlci5zZXRDb29raWUoXCJfX3Bob2VuaXhfZmxhc2hfX1wiLCBmbGFzaCArIFwiOyBtYXgtYWdlPTYwMDAwOyBwYXRoPS9cIikgfVxuICAgIHdpbmRvdy5sb2NhdGlvbiA9IHRvVVJMXG4gIH0sXG5cbiAgbG9jYWxLZXkobmFtZXNwYWNlLCBzdWJrZXkpeyByZXR1cm4gYCR7bmFtZXNwYWNlfS0ke3N1YmtleX1gIH0sXG5cbiAgZ2V0SGFzaFRhcmdldEVsKG1heWJlSGFzaCl7XG4gICAgbGV0IGhhc2ggPSBtYXliZUhhc2gudG9TdHJpbmcoKS5zdWJzdHJpbmcoMSlcbiAgICBpZihoYXNoID09PSBcIlwiKXsgcmV0dXJuIH1cbiAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaGFzaCkgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgYVtuYW1lPVwiJHtoYXNofVwiXWApXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQnJvd3NlclxuIiwgImltcG9ydCB7XG4gIENIRUNLQUJMRV9JTlBVVFMsXG4gIERFQk9VTkNFX1BSRVZfS0VZLFxuICBERUJPVU5DRV9UUklHR0VSLFxuICBGT0NVU0FCTEVfSU5QVVRTLFxuICBQSFhfQ09NUE9ORU5ULFxuICBQSFhfRVZFTlRfQ0xBU1NFUyxcbiAgUEhYX0hBU19GT0NVU0VELFxuICBQSFhfSEFTX1NVQk1JVFRFRCxcbiAgUEhYX01BSU4sXG4gIFBIWF9OT19GRUVEQkFDS19DTEFTUyxcbiAgUEhYX1BBUkVOVF9JRCxcbiAgUEhYX1BSSVZBVEUsXG4gIFBIWF9SRUYsXG4gIFBIWF9TRVNTSU9OLFxuICBQSFhfU1RBVElDLFxuICBQSFhfVVBMT0FEX1JFRixcbiAgUEhYX1ZJRVdfU0VMRUNUT1IsXG4gIFRIUk9UVExFRFxufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQge1xuICBjbG9uZSxcbiAgbG9nRXJyb3Jcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5sZXQgRE9NID0ge1xuICBieUlkKGlkKXsgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSB8fCBsb2dFcnJvcihgbm8gaWQgZm91bmQgZm9yICR7aWR9YCkgfSxcblxuICByZW1vdmVDbGFzcyhlbCwgY2xhc3NOYW1lKXtcbiAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSlcbiAgICBpZihlbC5jbGFzc0xpc3QubGVuZ3RoID09PSAwKXsgZWwucmVtb3ZlQXR0cmlidXRlKFwiY2xhc3NcIikgfVxuICB9LFxuXG4gIGFsbChub2RlLCBxdWVyeSwgY2FsbGJhY2spe1xuICAgIGlmKCFub2RlKXsgcmV0dXJuIFtdIH1cbiAgICBsZXQgYXJyYXkgPSBBcnJheS5mcm9tKG5vZGUucXVlcnlTZWxlY3RvckFsbChxdWVyeSkpXG4gICAgcmV0dXJuIGNhbGxiYWNrID8gYXJyYXkuZm9yRWFjaChjYWxsYmFjaykgOiBhcnJheVxuICB9LFxuXG4gIGNoaWxkTm9kZUxlbmd0aChodG1sKXtcbiAgICBsZXQgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIilcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sXG4gICAgcmV0dXJuIHRlbXBsYXRlLmNvbnRlbnQuY2hpbGRFbGVtZW50Q291bnRcbiAgfSxcblxuICBpc1VwbG9hZElucHV0KGVsKXsgcmV0dXJuIGVsLnR5cGUgPT09IFwiZmlsZVwiICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRikgIT09IG51bGwgfSxcblxuICBmaW5kVXBsb2FkSW5wdXRzKG5vZGUpeyByZXR1cm4gdGhpcy5hbGwobm9kZSwgYGlucHV0W3R5cGU9XCJmaWxlXCJdWyR7UEhYX1VQTE9BRF9SRUZ9XWApIH0sXG5cbiAgZmluZENvbXBvbmVudE5vZGVMaXN0KG5vZGUsIGNpZCl7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyV2l0aGluU2FtZUxpdmVWaWV3KHRoaXMuYWxsKG5vZGUsIGBbJHtQSFhfQ09NUE9ORU5UfT1cIiR7Y2lkfVwiXWApLCBub2RlKVxuICB9LFxuXG4gIGlzUGh4RGVzdHJveWVkKG5vZGUpe1xuICAgIHJldHVybiBub2RlLmlkICYmIERPTS5wcml2YXRlKG5vZGUsIFwiZGVzdHJveWVkXCIpID8gdHJ1ZSA6IGZhbHNlXG4gIH0sXG5cbiAgbWFya1BoeENoaWxkRGVzdHJveWVkKGVsKXtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoUEhYX1NFU1NJT04sIFwiXCIpXG4gICAgdGhpcy5wdXRQcml2YXRlKGVsLCBcImRlc3Ryb3llZFwiLCB0cnVlKVxuICB9LFxuXG4gIGZpbmRQaHhDaGlsZHJlbkluRnJhZ21lbnQoaHRtbCwgcGFyZW50SWQpe1xuICAgIGxldCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKVxuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGh0bWxcbiAgICByZXR1cm4gdGhpcy5maW5kUGh4Q2hpbGRyZW4odGVtcGxhdGUuY29udGVudCwgcGFyZW50SWQpXG4gIH0sXG5cbiAgaXNJZ25vcmVkKGVsLCBwaHhVcGRhdGUpe1xuICAgIHJldHVybiAoZWwuZ2V0QXR0cmlidXRlKHBoeFVwZGF0ZSkgfHwgZWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtdXBkYXRlXCIpKSA9PT0gXCJpZ25vcmVcIlxuICB9LFxuXG4gIGlzUGh4VXBkYXRlKGVsLCBwaHhVcGRhdGUsIHVwZGF0ZVR5cGVzKXtcbiAgICByZXR1cm4gZWwuZ2V0QXR0cmlidXRlICYmIHVwZGF0ZVR5cGVzLmluZGV4T2YoZWwuZ2V0QXR0cmlidXRlKHBoeFVwZGF0ZSkpID49IDBcbiAgfSxcblxuICBmaW5kUGh4Q2hpbGRyZW4oZWwsIHBhcmVudElkKXtcbiAgICByZXR1cm4gdGhpcy5hbGwoZWwsIGAke1BIWF9WSUVXX1NFTEVDVE9SfVske1BIWF9QQVJFTlRfSUR9PVwiJHtwYXJlbnRJZH1cIl1gKVxuICB9LFxuXG4gIGZpbmRQYXJlbnRDSURzKG5vZGUsIGNpZHMpe1xuICAgIGxldCBpbml0aWFsID0gbmV3IFNldChjaWRzKVxuICAgIHJldHVybiBjaWRzLnJlZHVjZSgoYWNjLCBjaWQpID0+IHtcbiAgICAgIGxldCBzZWxlY3RvciA9IGBbJHtQSFhfQ09NUE9ORU5UfT1cIiR7Y2lkfVwiXSBbJHtQSFhfQ09NUE9ORU5UfV1gXG5cbiAgICAgIHRoaXMuZmlsdGVyV2l0aGluU2FtZUxpdmVWaWV3KHRoaXMuYWxsKG5vZGUsIHNlbGVjdG9yKSwgbm9kZSlcbiAgICAgICAgLm1hcChlbCA9PiBwYXJzZUludChlbC5nZXRBdHRyaWJ1dGUoUEhYX0NPTVBPTkVOVCkpKVxuICAgICAgICAuZm9yRWFjaChjaGlsZENJRCA9PiBhY2MuZGVsZXRlKGNoaWxkQ0lEKSlcblxuICAgICAgcmV0dXJuIGFjY1xuICAgIH0sIGluaXRpYWwpXG4gIH0sXG5cbiAgZmlsdGVyV2l0aGluU2FtZUxpdmVWaWV3KG5vZGVzLCBwYXJlbnQpe1xuICAgIGlmKHBhcmVudC5xdWVyeVNlbGVjdG9yKFBIWF9WSUVXX1NFTEVDVE9SKSl7XG4gICAgICByZXR1cm4gbm9kZXMuZmlsdGVyKGVsID0+IHRoaXMud2l0aGluU2FtZUxpdmVWaWV3KGVsLCBwYXJlbnQpKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbm9kZXNcbiAgICB9XG4gIH0sXG5cbiAgd2l0aGluU2FtZUxpdmVWaWV3KG5vZGUsIHBhcmVudCl7XG4gICAgd2hpbGUobm9kZSA9IG5vZGUucGFyZW50Tm9kZSl7XG4gICAgICBpZihub2RlLmlzU2FtZU5vZGUocGFyZW50KSl7IHJldHVybiB0cnVlIH1cbiAgICAgIGlmKG5vZGUuZ2V0QXR0cmlidXRlKFBIWF9TRVNTSU9OKSAhPT0gbnVsbCl7IHJldHVybiBmYWxzZSB9XG4gICAgfVxuICB9LFxuXG4gIHByaXZhdGUoZWwsIGtleSl7IHJldHVybiBlbFtQSFhfUFJJVkFURV0gJiYgZWxbUEhYX1BSSVZBVEVdW2tleV0gfSxcblxuICBkZWxldGVQcml2YXRlKGVsLCBrZXkpeyBlbFtQSFhfUFJJVkFURV0gJiYgZGVsZXRlIChlbFtQSFhfUFJJVkFURV1ba2V5XSkgfSxcblxuICBwdXRQcml2YXRlKGVsLCBrZXksIHZhbHVlKXtcbiAgICBpZighZWxbUEhYX1BSSVZBVEVdKXsgZWxbUEhYX1BSSVZBVEVdID0ge30gfVxuICAgIGVsW1BIWF9QUklWQVRFXVtrZXldID0gdmFsdWVcbiAgfSxcblxuICBjb3B5UHJpdmF0ZXModGFyZ2V0LCBzb3VyY2Upe1xuICAgIGlmKHNvdXJjZVtQSFhfUFJJVkFURV0pe1xuICAgICAgdGFyZ2V0W1BIWF9QUklWQVRFXSA9IGNsb25lKHNvdXJjZVtQSFhfUFJJVkFURV0pXG4gICAgfVxuICB9LFxuXG4gIHB1dFRpdGxlKHN0cil7XG4gICAgbGV0IHRpdGxlRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwidGl0bGVcIilcbiAgICBsZXQge3ByZWZpeCwgc3VmZml4fSA9IHRpdGxlRWwuZGF0YXNldFxuICAgIGRvY3VtZW50LnRpdGxlID0gYCR7cHJlZml4IHx8IFwiXCJ9JHtzdHJ9JHtzdWZmaXggfHwgXCJcIn1gXG4gIH0sXG5cbiAgZGVib3VuY2UoZWwsIGV2ZW50LCBwaHhEZWJvdW5jZSwgZGVmYXVsdERlYm91bmNlLCBwaHhUaHJvdHRsZSwgZGVmYXVsdFRocm90dGxlLCBjYWxsYmFjayl7XG4gICAgbGV0IGRlYm91bmNlID0gZWwuZ2V0QXR0cmlidXRlKHBoeERlYm91bmNlKVxuICAgIGxldCB0aHJvdHRsZSA9IGVsLmdldEF0dHJpYnV0ZShwaHhUaHJvdHRsZSlcbiAgICBpZihkZWJvdW5jZSA9PT0gXCJcIil7IGRlYm91bmNlID0gZGVmYXVsdERlYm91bmNlIH1cbiAgICBpZih0aHJvdHRsZSA9PT0gXCJcIil7IHRocm90dGxlID0gZGVmYXVsdFRocm90dGxlIH1cbiAgICBsZXQgdmFsdWUgPSBkZWJvdW5jZSB8fCB0aHJvdHRsZVxuICAgIHN3aXRjaCh2YWx1ZSl7XG4gICAgICBjYXNlIG51bGw6IHJldHVybiBjYWxsYmFjaygpXG5cbiAgICAgIGNhc2UgXCJibHVyXCI6XG4gICAgICAgIGlmKHRoaXMub25jZShlbCwgXCJkZWJvdW5jZS1ibHVyXCIpKXtcbiAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoKSA9PiBjYWxsYmFjaygpKVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBsZXQgdGltZW91dCA9IHBhcnNlSW50KHZhbHVlKVxuICAgICAgICBsZXQgdHJpZ2dlciA9ICgpID0+IHRocm90dGxlID8gdGhpcy5kZWxldGVQcml2YXRlKGVsLCBUSFJPVFRMRUQpIDogY2FsbGJhY2soKVxuICAgICAgICBsZXQgY3VycmVudEN5Y2xlID0gdGhpcy5pbmNDeWNsZShlbCwgREVCT1VOQ0VfVFJJR0dFUiwgdHJpZ2dlcilcbiAgICAgICAgaWYoaXNOYU4odGltZW91dCkpeyByZXR1cm4gbG9nRXJyb3IoYGludmFsaWQgdGhyb3R0bGUvZGVib3VuY2UgdmFsdWU6ICR7dmFsdWV9YCkgfVxuICAgICAgICBpZih0aHJvdHRsZSl7XG4gICAgICAgICAgbGV0IG5ld0tleURvd24gPSBmYWxzZVxuICAgICAgICAgIGlmKGV2ZW50LnR5cGUgPT09IFwia2V5ZG93blwiKXtcbiAgICAgICAgICAgIGxldCBwcmV2S2V5ID0gdGhpcy5wcml2YXRlKGVsLCBERUJPVU5DRV9QUkVWX0tFWSlcbiAgICAgICAgICAgIHRoaXMucHV0UHJpdmF0ZShlbCwgREVCT1VOQ0VfUFJFVl9LRVksIGV2ZW50LmtleSlcbiAgICAgICAgICAgIG5ld0tleURvd24gPSBwcmV2S2V5ICE9PSBldmVudC5rZXlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZighbmV3S2V5RG93biAmJiB0aGlzLnByaXZhdGUoZWwsIFRIUk9UVExFRCkpe1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKClcbiAgICAgICAgICAgIHRoaXMucHV0UHJpdmF0ZShlbCwgVEhST1RUTEVELCB0cnVlKVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnRyaWdnZXJDeWNsZShlbCwgREVCT1VOQ0VfVFJJR0dFUiksIHRpbWVvdXQpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy50cmlnZ2VyQ3ljbGUoZWwsIERFQk9VTkNFX1RSSUdHRVIsIGN1cnJlbnRDeWNsZSksIHRpbWVvdXQpXG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCBmb3JtID0gZWwuZm9ybVxuICAgICAgICBpZihmb3JtICYmIHRoaXMub25jZShmb3JtLCBcImJpbmQtZGVib3VuY2VcIikpe1xuICAgICAgICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCAoKSA9PiB7XG4gICAgICAgICAgICBBcnJheS5mcm9tKChuZXcgRm9ybURhdGEoZm9ybSkpLmVudHJpZXMoKSwgKFtuYW1lXSkgPT4ge1xuICAgICAgICAgICAgICBsZXQgaW5wdXQgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoYFtuYW1lPVwiJHtuYW1lfVwiXWApXG4gICAgICAgICAgICAgIHRoaXMuaW5jQ3ljbGUoaW5wdXQsIERFQk9VTkNFX1RSSUdHRVIpXG4gICAgICAgICAgICAgIHRoaXMuZGVsZXRlUHJpdmF0ZShpbnB1dCwgVEhST1RUTEVEKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMub25jZShlbCwgXCJiaW5kLWRlYm91bmNlXCIpKXtcbiAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoKSA9PiB0aGlzLnRyaWdnZXJDeWNsZShlbCwgREVCT1VOQ0VfVFJJR0dFUikpXG4gICAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgdHJpZ2dlckN5Y2xlKGVsLCBrZXksIGN1cnJlbnRDeWNsZSl7XG4gICAgbGV0IFtjeWNsZSwgdHJpZ2dlcl0gPSB0aGlzLnByaXZhdGUoZWwsIGtleSlcbiAgICBpZighY3VycmVudEN5Y2xlKXsgY3VycmVudEN5Y2xlID0gY3ljbGUgfVxuICAgIGlmKGN1cnJlbnRDeWNsZSA9PT0gY3ljbGUpe1xuICAgICAgdGhpcy5pbmNDeWNsZShlbCwga2V5KVxuICAgICAgdHJpZ2dlcigpXG4gICAgfVxuICB9LFxuXG4gIG9uY2UoZWwsIGtleSl7XG4gICAgaWYodGhpcy5wcml2YXRlKGVsLCBrZXkpID09PSB0cnVlKXsgcmV0dXJuIGZhbHNlIH1cbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIGtleSwgdHJ1ZSlcbiAgICByZXR1cm4gdHJ1ZVxuICB9LFxuXG4gIGluY0N5Y2xlKGVsLCBrZXksIHRyaWdnZXIgPSBmdW5jdGlvbiAoKXsgfSl7XG4gICAgbGV0IFtjdXJyZW50Q3ljbGVdID0gdGhpcy5wcml2YXRlKGVsLCBrZXkpIHx8IFswLCB0cmlnZ2VyXVxuICAgIGN1cnJlbnRDeWNsZSsrXG4gICAgdGhpcy5wdXRQcml2YXRlKGVsLCBrZXksIFtjdXJyZW50Q3ljbGUsIHRyaWdnZXJdKVxuICAgIHJldHVybiBjdXJyZW50Q3ljbGVcbiAgfSxcblxuICBkaXNjYXJkRXJyb3IoY29udGFpbmVyLCBlbCwgcGh4RmVlZGJhY2tGb3Ipe1xuICAgIGxldCBmaWVsZCA9IGVsLmdldEF0dHJpYnV0ZSAmJiBlbC5nZXRBdHRyaWJ1dGUocGh4RmVlZGJhY2tGb3IpXG4gICAgLy8gVE9ETzogUmVtb3ZlIGlkIGxvb2t1cCBhZnRlciB3ZSB1cGRhdGUgUGhvZW5peCB0byB1c2UgaW5wdXRfbmFtZSBpbnN0ZWFkIG9mIGlucHV0X2lkXG4gICAgbGV0IGlucHV0ID0gZmllbGQgJiYgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYFtpZD1cIiR7ZmllbGR9XCJdLCBbbmFtZT1cIiR7ZmllbGR9XCJdYClcbiAgICBpZighaW5wdXQpeyByZXR1cm4gfVxuXG4gICAgaWYoISh0aGlzLnByaXZhdGUoaW5wdXQsIFBIWF9IQVNfRk9DVVNFRCkgfHwgdGhpcy5wcml2YXRlKGlucHV0LmZvcm0sIFBIWF9IQVNfU1VCTUlUVEVEKSkpe1xuICAgICAgZWwuY2xhc3NMaXN0LmFkZChQSFhfTk9fRkVFREJBQ0tfQ0xBU1MpXG4gICAgfVxuICB9LFxuXG4gIHNob3dFcnJvcihpbnB1dEVsLCBwaHhGZWVkYmFja0Zvcil7XG4gICAgaWYoaW5wdXRFbC5pZCB8fCBpbnB1dEVsLm5hbWUpe1xuICAgICAgdGhpcy5hbGwoaW5wdXRFbC5mb3JtLCBgWyR7cGh4RmVlZGJhY2tGb3J9PVwiJHtpbnB1dEVsLmlkfVwiXSwgWyR7cGh4RmVlZGJhY2tGb3J9PVwiJHtpbnB1dEVsLm5hbWV9XCJdYCwgKGVsKSA9PiB7XG4gICAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoZWwsIFBIWF9OT19GRUVEQkFDS19DTEFTUylcbiAgICAgIH0pXG4gICAgfVxuICB9LFxuXG4gIGlzUGh4Q2hpbGQobm9kZSl7XG4gICAgcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlICYmIG5vZGUuZ2V0QXR0cmlidXRlKFBIWF9QQVJFTlRfSUQpXG4gIH0sXG5cbiAgZGlzcGF0Y2hFdmVudCh0YXJnZXQsIGV2ZW50U3RyaW5nLCBkZXRhaWwgPSB7fSl7XG4gICAgbGV0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50U3RyaW5nLCB7YnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgZGV0YWlsOiBkZXRhaWx9KVxuICAgIHRhcmdldC5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuICB9LFxuXG4gIGNsb25lTm9kZShub2RlLCBodG1sKXtcbiAgICBpZih0eXBlb2YgKGh0bWwpID09PSBcInVuZGVmaW5lZFwiKXtcbiAgICAgIHJldHVybiBub2RlLmNsb25lTm9kZSh0cnVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgY2xvbmVkID0gbm9kZS5jbG9uZU5vZGUoZmFsc2UpXG4gICAgICBjbG9uZWQuaW5uZXJIVE1MID0gaHRtbFxuICAgICAgcmV0dXJuIGNsb25lZFxuICAgIH1cbiAgfSxcblxuICBtZXJnZUF0dHJzKHRhcmdldCwgc291cmNlLCBvcHRzID0ge30pe1xuICAgIGxldCBleGNsdWRlID0gb3B0cy5leGNsdWRlIHx8IFtdXG4gICAgbGV0IGlzSWdub3JlZCA9IG9wdHMuaXNJZ25vcmVkXG4gICAgbGV0IHNvdXJjZUF0dHJzID0gc291cmNlLmF0dHJpYnV0ZXNcbiAgICBmb3IobGV0IGkgPSBzb3VyY2VBdHRycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7XG4gICAgICBsZXQgbmFtZSA9IHNvdXJjZUF0dHJzW2ldLm5hbWVcbiAgICAgIGlmKGV4Y2x1ZGUuaW5kZXhPZihuYW1lKSA8IDApeyB0YXJnZXQuc2V0QXR0cmlidXRlKG5hbWUsIHNvdXJjZS5nZXRBdHRyaWJ1dGUobmFtZSkpIH1cbiAgICB9XG5cbiAgICBsZXQgdGFyZ2V0QXR0cnMgPSB0YXJnZXQuYXR0cmlidXRlc1xuICAgIGZvcihsZXQgaSA9IHRhcmdldEF0dHJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXtcbiAgICAgIGxldCBuYW1lID0gdGFyZ2V0QXR0cnNbaV0ubmFtZVxuICAgICAgaWYoaXNJZ25vcmVkKXtcbiAgICAgICAgaWYobmFtZS5zdGFydHNXaXRoKFwiZGF0YS1cIikgJiYgIXNvdXJjZS5oYXNBdHRyaWJ1dGUobmFtZSkpeyB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKG5hbWUpIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmKCFzb3VyY2UuaGFzQXR0cmlidXRlKG5hbWUpKXsgdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZShuYW1lKSB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1lcmdlRm9jdXNlZElucHV0KHRhcmdldCwgc291cmNlKXtcbiAgICAvLyBza2lwIHNlbGVjdHMgYmVjYXVzZSBGRiB3aWxsIHJlc2V0IGhpZ2hsaWdodGVkIGluZGV4IGZvciBhbnkgc2V0QXR0cmlidXRlXG4gICAgaWYoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCkpeyBET00ubWVyZ2VBdHRycyh0YXJnZXQsIHNvdXJjZSwge2V4Y2VwdDogW1widmFsdWVcIl19KSB9XG4gICAgaWYoc291cmNlLnJlYWRPbmx5KXtcbiAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoXCJyZWFkb25seVwiLCB0cnVlKVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKFwicmVhZG9ubHlcIilcbiAgICB9XG4gIH0sXG5cbiAgaGFzU2VsZWN0aW9uUmFuZ2UoZWwpe1xuICAgIHJldHVybiBlbC5zZXRTZWxlY3Rpb25SYW5nZSAmJiAoZWwudHlwZSA9PT0gXCJ0ZXh0XCIgfHwgZWwudHlwZSA9PT0gXCJ0ZXh0YXJlYVwiKVxuICB9LFxuXG4gIHJlc3RvcmVGb2N1cyhmb2N1c2VkLCBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKXtcbiAgICBpZighRE9NLmlzVGV4dHVhbElucHV0KGZvY3VzZWQpKXsgcmV0dXJuIH1cbiAgICBsZXQgd2FzRm9jdXNlZCA9IGZvY3VzZWQubWF0Y2hlcyhcIjpmb2N1c1wiKVxuICAgIGlmKGZvY3VzZWQucmVhZE9ubHkpeyBmb2N1c2VkLmJsdXIoKSB9XG4gICAgaWYoIXdhc0ZvY3VzZWQpeyBmb2N1c2VkLmZvY3VzKCkgfVxuICAgIGlmKHRoaXMuaGFzU2VsZWN0aW9uUmFuZ2UoZm9jdXNlZCkpe1xuICAgICAgZm9jdXNlZC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKVxuICAgIH1cbiAgfSxcblxuICBpc0Zvcm1JbnB1dChlbCl7IHJldHVybiAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2kudGVzdChlbC50YWdOYW1lKSAmJiBlbC50eXBlICE9PSBcImJ1dHRvblwiIH0sXG5cbiAgc3luY0F0dHJzVG9Qcm9wcyhlbCl7XG4gICAgaWYoZWwgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmIENIRUNLQUJMRV9JTlBVVFMuaW5kZXhPZihlbC50eXBlLnRvTG9jYWxlTG93ZXJDYXNlKCkpID49IDApe1xuICAgICAgZWwuY2hlY2tlZCA9IGVsLmdldEF0dHJpYnV0ZShcImNoZWNrZWRcIikgIT09IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgc3luY1Byb3BzVG9BdHRycyhlbCl7XG4gICAgaWYoZWwgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCl7XG4gICAgICBsZXQgc2VsZWN0ZWRJdGVtID0gZWwub3B0aW9ucy5pdGVtKGVsLnNlbGVjdGVkSW5kZXgpXG4gICAgICBpZihzZWxlY3RlZEl0ZW0gJiYgc2VsZWN0ZWRJdGVtLmdldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIpID09PSBudWxsKXtcbiAgICAgICAgc2VsZWN0ZWRJdGVtLnNldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIsIFwiXCIpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGlzVGV4dHVhbElucHV0KGVsKXsgcmV0dXJuIEZPQ1VTQUJMRV9JTlBVVFMuaW5kZXhPZihlbC50eXBlKSA+PSAwIH0sXG5cbiAgaXNOb3dUcmlnZ2VyRm9ybUV4dGVybmFsKGVsLCBwaHhUcmlnZ2VyRXh0ZXJuYWwpe1xuICAgIHJldHVybiBlbC5nZXRBdHRyaWJ1dGUgJiYgZWwuZ2V0QXR0cmlidXRlKHBoeFRyaWdnZXJFeHRlcm5hbCkgIT09IG51bGxcbiAgfSxcblxuICBzeW5jUGVuZGluZ1JlZihmcm9tRWwsIHRvRWwsIGRpc2FibGVXaXRoKXtcbiAgICBsZXQgcmVmID0gZnJvbUVsLmdldEF0dHJpYnV0ZShQSFhfUkVGKVxuICAgIGlmKHJlZiA9PT0gbnVsbCl7IHJldHVybiB0cnVlIH1cblxuICAgIGlmKERPTS5pc0Zvcm1JbnB1dChmcm9tRWwpIHx8IGZyb21FbC5nZXRBdHRyaWJ1dGUoZGlzYWJsZVdpdGgpICE9PSBudWxsKXtcbiAgICAgIGlmKERPTS5pc1VwbG9hZElucHV0KGZyb21FbCkpeyBET00ubWVyZ2VBdHRycyhmcm9tRWwsIHRvRWwsIHtpc0lnbm9yZWQ6IHRydWV9KSB9XG4gICAgICBET00ucHV0UHJpdmF0ZShmcm9tRWwsIFBIWF9SRUYsIHRvRWwpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2Uge1xuICAgICAgUEhYX0VWRU5UX0NMQVNTRVMuZm9yRWFjaChjbGFzc05hbWUgPT4ge1xuICAgICAgICBmcm9tRWwuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkgJiYgdG9FbC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSlcbiAgICAgIH0pXG4gICAgICB0b0VsLnNldEF0dHJpYnV0ZShQSFhfUkVGLCByZWYpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfSxcblxuICBjbGVhbkNoaWxkTm9kZXMoY29udGFpbmVyLCBwaHhVcGRhdGUpe1xuICAgIGlmKERPTS5pc1BoeFVwZGF0ZShjb250YWluZXIsIHBoeFVwZGF0ZSwgW1wiYXBwZW5kXCIsIFwicHJlcGVuZFwiXSkpe1xuICAgICAgbGV0IHRvUmVtb3ZlID0gW11cbiAgICAgIGNvbnRhaW5lci5jaGlsZE5vZGVzLmZvckVhY2goY2hpbGROb2RlID0+IHtcbiAgICAgICAgaWYoIWNoaWxkTm9kZS5pZCl7XG4gICAgICAgICAgLy8gU2tpcCB3YXJuaW5nIGlmIGl0J3MgYW4gZW1wdHkgdGV4dCBub2RlIChlLmcuIGEgbmV3LWxpbmUpXG4gICAgICAgICAgbGV0IGlzRW1wdHlUZXh0Tm9kZSA9IGNoaWxkTm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGROb2RlLm5vZGVWYWx1ZS50cmltKCkgPT09IFwiXCJcbiAgICAgICAgICBpZighaXNFbXB0eVRleHROb2RlKXtcbiAgICAgICAgICAgIGxvZ0Vycm9yKFwib25seSBIVE1MIGVsZW1lbnQgdGFncyB3aXRoIGFuIGlkIGFyZSBhbGxvd2VkIGluc2lkZSBjb250YWluZXJzIHdpdGggcGh4LXVwZGF0ZS5cXG5cXG5cIiArXG4gICAgICAgICAgICAgIGByZW1vdmluZyBpbGxlZ2FsIG5vZGU6IFwiJHsoY2hpbGROb2RlLm91dGVySFRNTCB8fCBjaGlsZE5vZGUubm9kZVZhbHVlKS50cmltKCl9XCJcXG5cXG5gKVxuICAgICAgICAgIH1cbiAgICAgICAgICB0b1JlbW92ZS5wdXNoKGNoaWxkTm9kZSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHRvUmVtb3ZlLmZvckVhY2goY2hpbGROb2RlID0+IGNoaWxkTm9kZS5yZW1vdmUoKSlcbiAgICB9XG4gIH0sXG5cbiAgcmVwbGFjZVJvb3RDb250YWluZXIoY29udGFpbmVyLCB0YWdOYW1lLCBhdHRycyl7XG4gICAgbGV0IHJldGFpbmVkQXR0cnMgPSBuZXcgU2V0KFtcImlkXCIsIFBIWF9TRVNTSU9OLCBQSFhfU1RBVElDLCBQSFhfTUFJTl0pXG4gICAgaWYoY29udGFpbmVyLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGFnTmFtZS50b0xvd2VyQ2FzZSgpKXtcbiAgICAgIEFycmF5LmZyb20oY29udGFpbmVyLmF0dHJpYnV0ZXMpXG4gICAgICAgIC5maWx0ZXIoYXR0ciA9PiAhcmV0YWluZWRBdHRycy5oYXMoYXR0ci5uYW1lLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICAuZm9yRWFjaChhdHRyID0+IGNvbnRhaW5lci5yZW1vdmVBdHRyaWJ1dGUoYXR0ci5uYW1lKSlcblxuICAgICAgT2JqZWN0LmtleXMoYXR0cnMpXG4gICAgICAgIC5maWx0ZXIobmFtZSA9PiAhcmV0YWluZWRBdHRycy5oYXMobmFtZS50b0xvd2VyQ2FzZSgpKSlcbiAgICAgICAgLmZvckVhY2goYXR0ciA9PiBjb250YWluZXIuc2V0QXR0cmlidXRlKGF0dHIsIGF0dHJzW2F0dHJdKSlcblxuICAgICAgcmV0dXJuIGNvbnRhaW5lclxuXG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBuZXdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpXG4gICAgICBPYmplY3Qua2V5cyhhdHRycykuZm9yRWFjaChhdHRyID0+IG5ld0NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoYXR0ciwgYXR0cnNbYXR0cl0pKVxuICAgICAgcmV0YWluZWRBdHRycy5mb3JFYWNoKGF0dHIgPT4gbmV3Q29udGFpbmVyLnNldEF0dHJpYnV0ZShhdHRyLCBjb250YWluZXIuZ2V0QXR0cmlidXRlKGF0dHIpKSlcbiAgICAgIG5ld0NvbnRhaW5lci5pbm5lckhUTUwgPSBjb250YWluZXIuaW5uZXJIVE1MXG4gICAgICBjb250YWluZXIucmVwbGFjZVdpdGgobmV3Q29udGFpbmVyKVxuICAgICAgcmV0dXJuIG5ld0NvbnRhaW5lclxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBET01cbiIsICJpbXBvcnQge1xuICBQSFhfQUNUSVZFX0VOVFJZX1JFRlMsXG4gIFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCxcbiAgUEhYX1BSRUZMSUdIVEVEX1JFRlNcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IHtcbiAgY2hhbm5lbFVwbG9hZGVyLFxuICBsb2dFcnJvclxufSBmcm9tIFwiLi91dGlsc1wiXG5cbmltcG9ydCBMaXZlVXBsb2FkZXIgZnJvbSBcIi4vbGl2ZV91cGxvYWRlclwiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVwbG9hZEVudHJ5IHtcbiAgc3RhdGljIGlzQWN0aXZlKGZpbGVFbCwgZmlsZSl7XG4gICAgbGV0IGlzTmV3ID0gZmlsZS5fcGh4UmVmID09PSB1bmRlZmluZWRcbiAgICBsZXQgYWN0aXZlUmVmcyA9IGZpbGVFbC5nZXRBdHRyaWJ1dGUoUEhYX0FDVElWRV9FTlRSWV9SRUZTKS5zcGxpdChcIixcIilcbiAgICBsZXQgaXNBY3RpdmUgPSBhY3RpdmVSZWZzLmluZGV4T2YoTGl2ZVVwbG9hZGVyLmdlbkZpbGVSZWYoZmlsZSkpID49IDBcbiAgICByZXR1cm4gZmlsZS5zaXplID4gMCAmJiAoaXNOZXcgfHwgaXNBY3RpdmUpXG4gIH1cblxuICBzdGF0aWMgaXNQcmVmbGlnaHRlZChmaWxlRWwsIGZpbGUpe1xuICAgIGxldCBwcmVmbGlnaHRlZFJlZnMgPSBmaWxlRWwuZ2V0QXR0cmlidXRlKFBIWF9QUkVGTElHSFRFRF9SRUZTKS5zcGxpdChcIixcIilcbiAgICBsZXQgaXNQcmVmbGlnaHRlZCA9IHByZWZsaWdodGVkUmVmcy5pbmRleE9mKExpdmVVcGxvYWRlci5nZW5GaWxlUmVmKGZpbGUpKSA+PSAwXG4gICAgcmV0dXJuIGlzUHJlZmxpZ2h0ZWQgJiYgdGhpcy5pc0FjdGl2ZShmaWxlRWwsIGZpbGUpXG4gIH1cblxuICBjb25zdHJ1Y3RvcihmaWxlRWwsIGZpbGUsIHZpZXcpe1xuICAgIHRoaXMucmVmID0gTGl2ZVVwbG9hZGVyLmdlbkZpbGVSZWYoZmlsZSlcbiAgICB0aGlzLmZpbGVFbCA9IGZpbGVFbFxuICAgIHRoaXMuZmlsZSA9IGZpbGVcbiAgICB0aGlzLnZpZXcgPSB2aWV3XG4gICAgdGhpcy5tZXRhID0gbnVsbFxuICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2VcbiAgICB0aGlzLl9pc0RvbmUgPSBmYWxzZVxuICAgIHRoaXMuX3Byb2dyZXNzID0gMFxuICAgIHRoaXMuX2xhc3RQcm9ncmVzc1NlbnQgPSAtMVxuICAgIHRoaXMuX29uRG9uZSA9IGZ1bmN0aW9uICgpeyB9XG4gICAgdGhpcy5fb25FbFVwZGF0ZWQgPSB0aGlzLm9uRWxVcGRhdGVkLmJpbmQodGhpcylcbiAgICB0aGlzLmZpbGVFbC5hZGRFdmVudExpc3RlbmVyKFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCwgdGhpcy5fb25FbFVwZGF0ZWQpXG4gIH1cblxuICBtZXRhZGF0YSgpeyByZXR1cm4gdGhpcy5tZXRhIH1cblxuICBwcm9ncmVzcyhwcm9ncmVzcyl7XG4gICAgdGhpcy5fcHJvZ3Jlc3MgPSBNYXRoLmZsb29yKHByb2dyZXNzKVxuICAgIGlmKHRoaXMuX3Byb2dyZXNzID4gdGhpcy5fbGFzdFByb2dyZXNzU2VudCl7XG4gICAgICBpZih0aGlzLl9wcm9ncmVzcyA+PSAxMDApe1xuICAgICAgICB0aGlzLl9wcm9ncmVzcyA9IDEwMFxuICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50ID0gMTAwXG4gICAgICAgIHRoaXMuX2lzRG9uZSA9IHRydWVcbiAgICAgICAgdGhpcy52aWV3LnB1c2hGaWxlUHJvZ3Jlc3ModGhpcy5maWxlRWwsIHRoaXMucmVmLCAxMDAsICgpID0+IHtcbiAgICAgICAgICBMaXZlVXBsb2FkZXIudW50cmFja0ZpbGUodGhpcy5maWxlRWwsIHRoaXMuZmlsZSlcbiAgICAgICAgICB0aGlzLl9vbkRvbmUoKVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbGFzdFByb2dyZXNzU2VudCA9IHRoaXMuX3Byb2dyZXNzXG4gICAgICAgIHRoaXMudmlldy5wdXNoRmlsZVByb2dyZXNzKHRoaXMuZmlsZUVsLCB0aGlzLnJlZiwgdGhpcy5fcHJvZ3Jlc3MpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2FuY2VsKCl7XG4gICAgdGhpcy5faXNDYW5jZWxsZWQgPSB0cnVlXG4gICAgdGhpcy5faXNEb25lID0gdHJ1ZVxuICAgIHRoaXMuX29uRG9uZSgpXG4gIH1cblxuICBpc0RvbmUoKXsgcmV0dXJuIHRoaXMuX2lzRG9uZSB9XG5cbiAgZXJyb3IocmVhc29uID0gXCJmYWlsZWRcIil7XG4gICAgdGhpcy52aWV3LnB1c2hGaWxlUHJvZ3Jlc3ModGhpcy5maWxlRWwsIHRoaXMucmVmLCB7ZXJyb3I6IHJlYXNvbn0pXG4gICAgTGl2ZVVwbG9hZGVyLmNsZWFyRmlsZXModGhpcy5maWxlRWwpXG4gIH1cblxuICAvL3ByaXZhdGVcblxuICBvbkRvbmUoY2FsbGJhY2spe1xuICAgIHRoaXMuX29uRG9uZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuZmlsZUVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoUEhYX0xJVkVfRklMRV9VUERBVEVELCB0aGlzLl9vbkVsVXBkYXRlZClcbiAgICAgIGNhbGxiYWNrKClcbiAgICB9XG4gIH1cblxuICBvbkVsVXBkYXRlZCgpe1xuICAgIGxldCBhY3RpdmVSZWZzID0gdGhpcy5maWxlRWwuZ2V0QXR0cmlidXRlKFBIWF9BQ1RJVkVfRU5UUllfUkVGUykuc3BsaXQoXCIsXCIpXG4gICAgaWYoYWN0aXZlUmVmcy5pbmRleE9mKHRoaXMucmVmKSA9PT0gLTEpeyB0aGlzLmNhbmNlbCgpIH1cbiAgfVxuXG4gIHRvUHJlZmxpZ2h0UGF5bG9hZCgpe1xuICAgIHJldHVybiB7XG4gICAgICBsYXN0X21vZGlmaWVkOiB0aGlzLmZpbGUubGFzdE1vZGlmaWVkLFxuICAgICAgbmFtZTogdGhpcy5maWxlLm5hbWUsXG4gICAgICBzaXplOiB0aGlzLmZpbGUuc2l6ZSxcbiAgICAgIHR5cGU6IHRoaXMuZmlsZS50eXBlLFxuICAgICAgcmVmOiB0aGlzLnJlZlxuICAgIH1cbiAgfVxuXG4gIHVwbG9hZGVyKHVwbG9hZGVycyl7XG4gICAgaWYodGhpcy5tZXRhLnVwbG9hZGVyKXtcbiAgICAgIGxldCBjYWxsYmFjayA9IHVwbG9hZGVyc1t0aGlzLm1ldGEudXBsb2FkZXJdIHx8IGxvZ0Vycm9yKGBubyB1cGxvYWRlciBjb25maWd1cmVkIGZvciAke3RoaXMubWV0YS51cGxvYWRlcn1gKVxuICAgICAgcmV0dXJuIHtuYW1lOiB0aGlzLm1ldGEudXBsb2FkZXIsIGNhbGxiYWNrOiBjYWxsYmFja31cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtuYW1lOiBcImNoYW5uZWxcIiwgY2FsbGJhY2s6IGNoYW5uZWxVcGxvYWRlcn1cbiAgICB9XG4gIH1cblxuICB6aXBQb3N0RmxpZ2h0KHJlc3Ape1xuICAgIHRoaXMubWV0YSA9IHJlc3AuZW50cmllc1t0aGlzLnJlZl1cbiAgICBpZighdGhpcy5tZXRhKXsgbG9nRXJyb3IoYG5vIHByZWZsaWdodCB1cGxvYWQgcmVzcG9uc2UgcmV0dXJuZWQgd2l0aCByZWYgJHt0aGlzLnJlZn1gLCB7aW5wdXQ6IHRoaXMuZmlsZUVsLCByZXNwb25zZTogcmVzcH0pIH1cbiAgfVxufVxuIiwgImltcG9ydCB7XG4gIFBIWF9ET05FX1JFRlMsXG4gIFBIWF9QUkVGTElHSFRFRF9SRUZTLFxuICBQSFhfVVBMT0FEX1JFRlxufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQge1xufSBmcm9tIFwiLi91dGlsc1wiXG5cbmltcG9ydCBET00gZnJvbSBcIi4vZG9tXCJcbmltcG9ydCBVcGxvYWRFbnRyeSBmcm9tIFwiLi91cGxvYWRfZW50cnlcIlxuXG5sZXQgbGl2ZVVwbG9hZGVyRmlsZVJlZiA9IDBcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGl2ZVVwbG9hZGVyIHtcbiAgc3RhdGljIGdlbkZpbGVSZWYoZmlsZSl7XG4gICAgbGV0IHJlZiA9IGZpbGUuX3BoeFJlZlxuICAgIGlmKHJlZiAhPT0gdW5kZWZpbmVkKXtcbiAgICAgIHJldHVybiByZWZcbiAgICB9IGVsc2Uge1xuICAgICAgZmlsZS5fcGh4UmVmID0gKGxpdmVVcGxvYWRlckZpbGVSZWYrKykudG9TdHJpbmcoKVxuICAgICAgcmV0dXJuIGZpbGUuX3BoeFJlZlxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRFbnRyeURhdGFVUkwoaW5wdXRFbCwgcmVmLCBjYWxsYmFjayl7XG4gICAgbGV0IGZpbGUgPSB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0RWwpLmZpbmQoZmlsZSA9PiB0aGlzLmdlbkZpbGVSZWYoZmlsZSkgPT09IHJlZilcbiAgICBjYWxsYmFjayhVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpKVxuICB9XG5cbiAgc3RhdGljIGhhc1VwbG9hZHNJblByb2dyZXNzKGZvcm1FbCl7XG4gICAgbGV0IGFjdGl2ZSA9IDBcbiAgICBET00uZmluZFVwbG9hZElucHV0cyhmb3JtRWwpLmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgaWYoaW5wdXQuZ2V0QXR0cmlidXRlKFBIWF9QUkVGTElHSFRFRF9SRUZTKSAhPT0gaW5wdXQuZ2V0QXR0cmlidXRlKFBIWF9ET05FX1JFRlMpKXtcbiAgICAgICAgYWN0aXZlKytcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBhY3RpdmUgPiAwXG4gIH1cblxuICBzdGF0aWMgc2VyaWFsaXplVXBsb2FkcyhpbnB1dEVsKXtcbiAgICBsZXQgZmlsZXMgPSB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0RWwpXG4gICAgbGV0IGZpbGVEYXRhID0ge31cbiAgICBmaWxlcy5mb3JFYWNoKGZpbGUgPT4ge1xuICAgICAgbGV0IGVudHJ5ID0ge3BhdGg6IGlucHV0RWwubmFtZX1cbiAgICAgIGxldCB1cGxvYWRSZWYgPSBpbnB1dEVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRilcbiAgICAgIGZpbGVEYXRhW3VwbG9hZFJlZl0gPSBmaWxlRGF0YVt1cGxvYWRSZWZdIHx8IFtdXG4gICAgICBlbnRyeS5yZWYgPSB0aGlzLmdlbkZpbGVSZWYoZmlsZSlcbiAgICAgIGVudHJ5Lm5hbWUgPSBmaWxlLm5hbWUgfHwgZW50cnkucmVmXG4gICAgICBlbnRyeS50eXBlID0gZmlsZS50eXBlXG4gICAgICBlbnRyeS5zaXplID0gZmlsZS5zaXplXG4gICAgICBmaWxlRGF0YVt1cGxvYWRSZWZdLnB1c2goZW50cnkpXG4gICAgfSlcbiAgICByZXR1cm4gZmlsZURhdGFcbiAgfVxuXG4gIHN0YXRpYyBjbGVhckZpbGVzKGlucHV0RWwpe1xuICAgIGlucHV0RWwudmFsdWUgPSBudWxsXG4gICAgaW5wdXRFbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpXG4gICAgRE9NLnB1dFByaXZhdGUoaW5wdXRFbCwgXCJmaWxlc1wiLCBbXSlcbiAgfVxuXG4gIHN0YXRpYyB1bnRyYWNrRmlsZShpbnB1dEVsLCBmaWxlKXtcbiAgICBET00ucHV0UHJpdmF0ZShpbnB1dEVsLCBcImZpbGVzXCIsIERPTS5wcml2YXRlKGlucHV0RWwsIFwiZmlsZXNcIikuZmlsdGVyKGYgPT4gIU9iamVjdC5pcyhmLCBmaWxlKSkpXG4gIH1cblxuICBzdGF0aWMgdHJhY2tGaWxlcyhpbnB1dEVsLCBmaWxlcyl7XG4gICAgaWYoaW5wdXRFbC5nZXRBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKSAhPT0gbnVsbCl7XG4gICAgICBsZXQgbmV3RmlsZXMgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiAhdGhpcy5hY3RpdmVGaWxlcyhpbnB1dEVsKS5maW5kKGYgPT4gT2JqZWN0LmlzKGYsIGZpbGUpKSlcbiAgICAgIERPTS5wdXRQcml2YXRlKGlucHV0RWwsIFwiZmlsZXNcIiwgdGhpcy5hY3RpdmVGaWxlcyhpbnB1dEVsKS5jb25jYXQobmV3RmlsZXMpKVxuICAgICAgaW5wdXRFbC52YWx1ZSA9IG51bGxcbiAgICB9IGVsc2Uge1xuICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXRFbCwgXCJmaWxlc1wiLCBmaWxlcylcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYWN0aXZlRmlsZUlucHV0cyhmb3JtRWwpe1xuICAgIGxldCBmaWxlSW5wdXRzID0gRE9NLmZpbmRVcGxvYWRJbnB1dHMoZm9ybUVsKVxuICAgIHJldHVybiBBcnJheS5mcm9tKGZpbGVJbnB1dHMpLmZpbHRlcihlbCA9PiBlbC5maWxlcyAmJiB0aGlzLmFjdGl2ZUZpbGVzKGVsKS5sZW5ndGggPiAwKVxuICB9XG5cbiAgc3RhdGljIGFjdGl2ZUZpbGVzKGlucHV0KXtcbiAgICByZXR1cm4gKERPTS5wcml2YXRlKGlucHV0LCBcImZpbGVzXCIpIHx8IFtdKS5maWx0ZXIoZiA9PiBVcGxvYWRFbnRyeS5pc0FjdGl2ZShpbnB1dCwgZikpXG4gIH1cblxuICBzdGF0aWMgaW5wdXRzQXdhaXRpbmdQcmVmbGlnaHQoZm9ybUVsKXtcbiAgICBsZXQgZmlsZUlucHV0cyA9IERPTS5maW5kVXBsb2FkSW5wdXRzKGZvcm1FbClcbiAgICByZXR1cm4gQXJyYXkuZnJvbShmaWxlSW5wdXRzKS5maWx0ZXIoaW5wdXQgPT4gdGhpcy5maWxlc0F3YWl0aW5nUHJlZmxpZ2h0KGlucHV0KS5sZW5ndGggPiAwKVxuICB9XG5cbiAgc3RhdGljIGZpbGVzQXdhaXRpbmdQcmVmbGlnaHQoaW5wdXQpe1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0KS5maWx0ZXIoZiA9PiAhVXBsb2FkRW50cnkuaXNQcmVmbGlnaHRlZChpbnB1dCwgZikpXG4gIH1cblxuICBjb25zdHJ1Y3RvcihpbnB1dEVsLCB2aWV3LCBvbkNvbXBsZXRlKXtcbiAgICB0aGlzLnZpZXcgPSB2aWV3XG4gICAgdGhpcy5vbkNvbXBsZXRlID0gb25Db21wbGV0ZVxuICAgIHRoaXMuX2VudHJpZXMgPVxuICAgICAgQXJyYXkuZnJvbShMaXZlVXBsb2FkZXIuZmlsZXNBd2FpdGluZ1ByZWZsaWdodChpbnB1dEVsKSB8fCBbXSlcbiAgICAgICAgLm1hcChmaWxlID0+IG5ldyBVcGxvYWRFbnRyeShpbnB1dEVsLCBmaWxlLCB2aWV3KSlcblxuICAgIHRoaXMubnVtRW50cmllc0luUHJvZ3Jlc3MgPSB0aGlzLl9lbnRyaWVzLmxlbmd0aFxuICB9XG5cbiAgZW50cmllcygpeyByZXR1cm4gdGhpcy5fZW50cmllcyB9XG5cbiAgaW5pdEFkYXB0ZXJVcGxvYWQocmVzcCwgb25FcnJvciwgbGl2ZVNvY2tldCl7XG4gICAgdGhpcy5fZW50cmllcyA9XG4gICAgICB0aGlzLl9lbnRyaWVzLm1hcChlbnRyeSA9PiB7XG4gICAgICAgIGVudHJ5LnppcFBvc3RGbGlnaHQocmVzcClcbiAgICAgICAgZW50cnkub25Eb25lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLm51bUVudHJpZXNJblByb2dyZXNzLS1cbiAgICAgICAgICBpZih0aGlzLm51bUVudHJpZXNJblByb2dyZXNzID09PSAwKXsgdGhpcy5vbkNvbXBsZXRlKCkgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gZW50cnlcbiAgICAgIH0pXG5cbiAgICBsZXQgZ3JvdXBlZEVudHJpZXMgPSB0aGlzLl9lbnRyaWVzLnJlZHVjZSgoYWNjLCBlbnRyeSkgPT4ge1xuICAgICAgbGV0IHtuYW1lLCBjYWxsYmFja30gPSBlbnRyeS51cGxvYWRlcihsaXZlU29ja2V0LnVwbG9hZGVycylcbiAgICAgIGFjY1tuYW1lXSA9IGFjY1tuYW1lXSB8fCB7Y2FsbGJhY2s6IGNhbGxiYWNrLCBlbnRyaWVzOiBbXX1cbiAgICAgIGFjY1tuYW1lXS5lbnRyaWVzLnB1c2goZW50cnkpXG4gICAgICByZXR1cm4gYWNjXG4gICAgfSwge30pXG5cbiAgICBmb3IobGV0IG5hbWUgaW4gZ3JvdXBlZEVudHJpZXMpe1xuICAgICAgbGV0IHtjYWxsYmFjaywgZW50cmllc30gPSBncm91cGVkRW50cmllc1tuYW1lXVxuICAgICAgY2FsbGJhY2soZW50cmllcywgb25FcnJvciwgcmVzcCwgbGl2ZVNvY2tldClcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBQSFhfQUNUSVZFX0VOVFJZX1JFRlMsXG4gIFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCxcbiAgUEhYX1BSRUZMSUdIVEVEX1JFRlMsXG4gIFBIWF9VUExPQURfUkVGXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCBMaXZlVXBsb2FkZXIgZnJvbSBcIi4vbGl2ZV91cGxvYWRlclwiXG5cbmxldCBIb29rcyA9IHtcbiAgTGl2ZUZpbGVVcGxvYWQ6IHtcbiAgICBhY3RpdmVSZWZzKCl7IHJldHVybiB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfQUNUSVZFX0VOVFJZX1JFRlMpIH0sXG5cbiAgICBwcmVmbGlnaHRlZFJlZnMoKXsgcmV0dXJuIHRoaXMuZWwuZ2V0QXR0cmlidXRlKFBIWF9QUkVGTElHSFRFRF9SRUZTKSB9LFxuXG4gICAgbW91bnRlZCgpeyB0aGlzLnByZWZsaWdodGVkV2FzID0gdGhpcy5wcmVmbGlnaHRlZFJlZnMoKSB9LFxuXG4gICAgdXBkYXRlZCgpe1xuICAgICAgbGV0IG5ld1ByZWZsaWdodHMgPSB0aGlzLnByZWZsaWdodGVkUmVmcygpXG4gICAgICBpZih0aGlzLnByZWZsaWdodGVkV2FzICE9PSBuZXdQcmVmbGlnaHRzKXtcbiAgICAgICAgdGhpcy5wcmVmbGlnaHRlZFdhcyA9IG5ld1ByZWZsaWdodHNcbiAgICAgICAgaWYobmV3UHJlZmxpZ2h0cyA9PT0gXCJcIil7XG4gICAgICAgICAgdGhpcy5fX3ZpZXcuY2FuY2VsU3VibWl0KHRoaXMuZWwuZm9ybSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZih0aGlzLmFjdGl2ZVJlZnMoKSA9PT0gXCJcIil7IHRoaXMuZWwudmFsdWUgPSBudWxsIH1cbiAgICAgIHRoaXMuZWwuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoUEhYX0xJVkVfRklMRV9VUERBVEVEKSlcbiAgICB9XG4gIH0sXG5cbiAgTGl2ZUltZ1ByZXZpZXc6IHtcbiAgICBtb3VudGVkKCl7XG4gICAgICB0aGlzLnJlZiA9IHRoaXMuZWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtZW50cnktcmVmXCIpXG4gICAgICB0aGlzLmlucHV0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRikpXG4gICAgICBMaXZlVXBsb2FkZXIuZ2V0RW50cnlEYXRhVVJMKHRoaXMuaW5wdXRFbCwgdGhpcy5yZWYsIHVybCA9PiB7XG4gICAgICAgIHRoaXMudXJsID0gdXJsXG4gICAgICAgIHRoaXMuZWwuc3JjID0gdXJsXG4gICAgICB9KVxuICAgIH0sXG4gICAgZGVzdHJveWVkKCl7XG4gICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHRoaXMudXJsKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBIb29rc1xuIiwgImltcG9ydCB7XG4gIG1heWJlXG59IGZyb20gXCIuL3V0aWxzXCJcblxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBET01Qb3N0TW9ycGhSZXN0b3JlciB7XG4gIGNvbnN0cnVjdG9yKGNvbnRhaW5lckJlZm9yZSwgY29udGFpbmVyQWZ0ZXIsIHVwZGF0ZVR5cGUpe1xuICAgIGxldCBpZHNCZWZvcmUgPSBuZXcgU2V0KClcbiAgICBsZXQgaWRzQWZ0ZXIgPSBuZXcgU2V0KFsuLi5jb250YWluZXJBZnRlci5jaGlsZHJlbl0ubWFwKGNoaWxkID0+IGNoaWxkLmlkKSlcblxuICAgIGxldCBlbGVtZW50c1RvTW9kaWZ5ID0gW11cblxuICAgIEFycmF5LmZyb20oY29udGFpbmVyQmVmb3JlLmNoaWxkcmVuKS5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgIGlmKGNoaWxkLmlkKXsgLy8gYWxsIG9mIG91ciBjaGlsZHJlbiBzaG91bGQgYmUgZWxlbWVudHMgd2l0aCBpZHNcbiAgICAgICAgaWRzQmVmb3JlLmFkZChjaGlsZC5pZClcbiAgICAgICAgaWYoaWRzQWZ0ZXIuaGFzKGNoaWxkLmlkKSl7XG4gICAgICAgICAgbGV0IHByZXZpb3VzRWxlbWVudElkID0gY2hpbGQucHJldmlvdXNFbGVtZW50U2libGluZyAmJiBjaGlsZC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmlkXG4gICAgICAgICAgZWxlbWVudHNUb01vZGlmeS5wdXNoKHtlbGVtZW50SWQ6IGNoaWxkLmlkLCBwcmV2aW91c0VsZW1lbnRJZDogcHJldmlvdXNFbGVtZW50SWR9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcblxuICAgIHRoaXMuY29udGFpbmVySWQgPSBjb250YWluZXJBZnRlci5pZFxuICAgIHRoaXMudXBkYXRlVHlwZSA9IHVwZGF0ZVR5cGVcbiAgICB0aGlzLmVsZW1lbnRzVG9Nb2RpZnkgPSBlbGVtZW50c1RvTW9kaWZ5XG4gICAgdGhpcy5lbGVtZW50SWRzVG9BZGQgPSBbLi4uaWRzQWZ0ZXJdLmZpbHRlcihpZCA9PiAhaWRzQmVmb3JlLmhhcyhpZCkpXG4gIH1cblxuICAvLyBXZSBkbyB0aGUgZm9sbG93aW5nIHRvIG9wdGltaXplIGFwcGVuZC9wcmVwZW5kIG9wZXJhdGlvbnM6XG4gIC8vICAgMSkgVHJhY2sgaWRzIG9mIG1vZGlmaWVkIGVsZW1lbnRzICYgb2YgbmV3IGVsZW1lbnRzXG4gIC8vICAgMikgQWxsIHRoZSBtb2RpZmllZCBlbGVtZW50cyBhcmUgcHV0IGJhY2sgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24gaW4gdGhlIERPTSB0cmVlXG4gIC8vICAgICAgYnkgc3RvcmluZyB0aGUgaWQgb2YgdGhlaXIgcHJldmlvdXMgc2libGluZ1xuICAvLyAgIDMpIE5ldyBlbGVtZW50cyBhcmUgZ29pbmcgdG8gYmUgcHV0IGluIHRoZSByaWdodCBwbGFjZSBieSBtb3JwaGRvbSBkdXJpbmcgYXBwZW5kLlxuICAvLyAgICAgIEZvciBwcmVwZW5kLCB3ZSBtb3ZlIHRoZW0gdG8gdGhlIGZpcnN0IHBvc2l0aW9uIGluIHRoZSBjb250YWluZXJcbiAgcGVyZm9ybSgpe1xuICAgIGxldCBjb250YWluZXIgPSBET00uYnlJZCh0aGlzLmNvbnRhaW5lcklkKVxuICAgIHRoaXMuZWxlbWVudHNUb01vZGlmeS5mb3JFYWNoKGVsZW1lbnRUb01vZGlmeSA9PiB7XG4gICAgICBpZihlbGVtZW50VG9Nb2RpZnkucHJldmlvdXNFbGVtZW50SWQpe1xuICAgICAgICBtYXliZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50VG9Nb2RpZnkucHJldmlvdXNFbGVtZW50SWQpLCBwcmV2aW91c0VsZW0gPT4ge1xuICAgICAgICAgIG1heWJlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5lbGVtZW50SWQpLCBlbGVtID0+IHtcbiAgICAgICAgICAgIGxldCBpc0luUmlnaHRQbGFjZSA9IGVsZW0ucHJldmlvdXNFbGVtZW50U2libGluZyAmJiBlbGVtLnByZXZpb3VzRWxlbWVudFNpYmxpbmcuaWQgPT0gcHJldmlvdXNFbGVtLmlkXG4gICAgICAgICAgICBpZighaXNJblJpZ2h0UGxhY2Upe1xuICAgICAgICAgICAgICBwcmV2aW91c0VsZW0uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJlbmRcIiwgZWxlbSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgY29udGFpbmVyXG4gICAgICAgIG1heWJlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5lbGVtZW50SWQpLCBlbGVtID0+IHtcbiAgICAgICAgICBsZXQgaXNJblJpZ2h0UGxhY2UgPSBlbGVtLnByZXZpb3VzRWxlbWVudFNpYmxpbmcgPT0gbnVsbFxuICAgICAgICAgIGlmKCFpc0luUmlnaHRQbGFjZSl7XG4gICAgICAgICAgICBjb250YWluZXIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJiZWdpblwiLCBlbGVtKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYodGhpcy51cGRhdGVUeXBlID09IFwicHJlcGVuZFwiKXtcbiAgICAgIHRoaXMuZWxlbWVudElkc1RvQWRkLnJldmVyc2UoKS5mb3JFYWNoKGVsZW1JZCA9PiB7XG4gICAgICAgIG1heWJlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1JZCksIGVsZW0gPT4gY29udGFpbmVyLmluc2VydEFkamFjZW50RWxlbWVudChcImFmdGVyYmVnaW5cIiwgZWxlbSkpXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuIiwgInZhciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFID0gMTE7XG5cbmZ1bmN0aW9uIG1vcnBoQXR0cnMoZnJvbU5vZGUsIHRvTm9kZSkge1xuICAgIHZhciB0b05vZGVBdHRycyA9IHRvTm9kZS5hdHRyaWJ1dGVzO1xuICAgIHZhciBhdHRyO1xuICAgIHZhciBhdHRyTmFtZTtcbiAgICB2YXIgYXR0ck5hbWVzcGFjZVVSSTtcbiAgICB2YXIgYXR0clZhbHVlO1xuICAgIHZhciBmcm9tVmFsdWU7XG5cbiAgICAvLyBkb2N1bWVudC1mcmFnbWVudHMgZG9udCBoYXZlIGF0dHJpYnV0ZXMgc28gbGV0cyBub3QgZG8gYW55dGhpbmdcbiAgICBpZiAodG9Ob2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFIHx8IGZyb21Ob2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIGF0dHJpYnV0ZXMgb24gb3JpZ2luYWwgRE9NIGVsZW1lbnRcbiAgICBmb3IgKHZhciBpID0gdG9Ob2RlQXR0cnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgYXR0ciA9IHRvTm9kZUF0dHJzW2ldO1xuICAgICAgICBhdHRyTmFtZSA9IGF0dHIubmFtZTtcbiAgICAgICAgYXR0ck5hbWVzcGFjZVVSSSA9IGF0dHIubmFtZXNwYWNlVVJJO1xuICAgICAgICBhdHRyVmFsdWUgPSBhdHRyLnZhbHVlO1xuXG4gICAgICAgIGlmIChhdHRyTmFtZXNwYWNlVVJJKSB7XG4gICAgICAgICAgICBhdHRyTmFtZSA9IGF0dHIubG9jYWxOYW1lIHx8IGF0dHJOYW1lO1xuICAgICAgICAgICAgZnJvbVZhbHVlID0gZnJvbU5vZGUuZ2V0QXR0cmlidXRlTlMoYXR0ck5hbWVzcGFjZVVSSSwgYXR0ck5hbWUpO1xuXG4gICAgICAgICAgICBpZiAoZnJvbVZhbHVlICE9PSBhdHRyVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXR0ci5wcmVmaXggPT09ICd4bWxucycpe1xuICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZSA9IGF0dHIubmFtZTsgLy8gSXQncyBub3QgYWxsb3dlZCB0byBzZXQgYW4gYXR0cmlidXRlIHdpdGggdGhlIFhNTE5TIG5hbWVzcGFjZSB3aXRob3V0IHNwZWNpZnlpbmcgdGhlIGB4bWxuc2AgcHJlZml4XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZyb21Ob2RlLnNldEF0dHJpYnV0ZU5TKGF0dHJOYW1lc3BhY2VVUkksIGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnJvbVZhbHVlID0gZnJvbU5vZGUuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKTtcblxuICAgICAgICAgICAgaWYgKGZyb21WYWx1ZSAhPT0gYXR0clZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZnJvbU5vZGUuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFueSBleHRyYSBhdHRyaWJ1dGVzIGZvdW5kIG9uIHRoZSBvcmlnaW5hbCBET00gZWxlbWVudCB0aGF0XG4gICAgLy8gd2VyZW4ndCBmb3VuZCBvbiB0aGUgdGFyZ2V0IGVsZW1lbnQuXG4gICAgdmFyIGZyb21Ob2RlQXR0cnMgPSBmcm9tTm9kZS5hdHRyaWJ1dGVzO1xuXG4gICAgZm9yICh2YXIgZCA9IGZyb21Ob2RlQXR0cnMubGVuZ3RoIC0gMTsgZCA+PSAwOyBkLS0pIHtcbiAgICAgICAgYXR0ciA9IGZyb21Ob2RlQXR0cnNbZF07XG4gICAgICAgIGF0dHJOYW1lID0gYXR0ci5uYW1lO1xuICAgICAgICBhdHRyTmFtZXNwYWNlVVJJID0gYXR0ci5uYW1lc3BhY2VVUkk7XG5cbiAgICAgICAgaWYgKGF0dHJOYW1lc3BhY2VVUkkpIHtcbiAgICAgICAgICAgIGF0dHJOYW1lID0gYXR0ci5sb2NhbE5hbWUgfHwgYXR0ck5hbWU7XG5cbiAgICAgICAgICAgIGlmICghdG9Ob2RlLmhhc0F0dHJpYnV0ZU5TKGF0dHJOYW1lc3BhY2VVUkksIGF0dHJOYW1lKSkge1xuICAgICAgICAgICAgICAgIGZyb21Ob2RlLnJlbW92ZUF0dHJpYnV0ZU5TKGF0dHJOYW1lc3BhY2VVUkksIGF0dHJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdG9Ob2RlLmhhc0F0dHJpYnV0ZShhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBmcm9tTm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG52YXIgcmFuZ2U7IC8vIENyZWF0ZSBhIHJhbmdlIG9iamVjdCBmb3IgZWZmaWNlbnRseSByZW5kZXJpbmcgc3RyaW5ncyB0byBlbGVtZW50cy5cbnZhciBOU19YSFRNTCA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcblxudmFyIGRvYyA9IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBkb2N1bWVudDtcbnZhciBIQVNfVEVNUExBVEVfU1VQUE9SVCA9ICEhZG9jICYmICdjb250ZW50JyBpbiBkb2MuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbnZhciBIQVNfUkFOR0VfU1VQUE9SVCA9ICEhZG9jICYmIGRvYy5jcmVhdGVSYW5nZSAmJiAnY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50JyBpbiBkb2MuY3JlYXRlUmFuZ2UoKTtcblxuZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnRGcm9tVGVtcGxhdGUoc3RyKSB7XG4gICAgdmFyIHRlbXBsYXRlID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gc3RyO1xuICAgIHJldHVybiB0ZW1wbGF0ZS5jb250ZW50LmNoaWxkTm9kZXNbMF07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyYWdtZW50RnJvbVJhbmdlKHN0cikge1xuICAgIGlmICghcmFuZ2UpIHtcbiAgICAgICAgcmFuZ2UgPSBkb2MuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZShkb2MuYm9keSk7XG4gICAgfVxuXG4gICAgdmFyIGZyYWdtZW50ID0gcmFuZ2UuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHN0cik7XG4gICAgcmV0dXJuIGZyYWdtZW50LmNoaWxkTm9kZXNbMF07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyYWdtZW50RnJvbVdyYXAoc3RyKSB7XG4gICAgdmFyIGZyYWdtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2JvZHknKTtcbiAgICBmcmFnbWVudC5pbm5lckhUTUwgPSBzdHI7XG4gICAgcmV0dXJuIGZyYWdtZW50LmNoaWxkTm9kZXNbMF07XG59XG5cbi8qKlxuICogVGhpcyBpcyBhYm91dCB0aGUgc2FtZVxuICogdmFyIGh0bWwgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHN0ciwgJ3RleHQvaHRtbCcpO1xuICogcmV0dXJuIGh0bWwuYm9keS5maXJzdENoaWxkO1xuICpcbiAqIEBtZXRob2QgdG9FbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKi9cbmZ1bmN0aW9uIHRvRWxlbWVudChzdHIpIHtcbiAgICBzdHIgPSBzdHIudHJpbSgpO1xuICAgIGlmIChIQVNfVEVNUExBVEVfU1VQUE9SVCkge1xuICAgICAgLy8gYXZvaWQgcmVzdHJpY3Rpb25zIG9uIGNvbnRlbnQgZm9yIHRoaW5ncyBsaWtlIGA8dHI+PHRoPkhpPC90aD48L3RyPmAgd2hpY2hcbiAgICAgIC8vIGNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCBkb2Vzbid0IHN1cHBvcnRcbiAgICAgIC8vIDx0ZW1wbGF0ZT4gc3VwcG9ydCBub3QgYXZhaWxhYmxlIGluIElFXG4gICAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRGcm9tVGVtcGxhdGUoc3RyKTtcbiAgICB9IGVsc2UgaWYgKEhBU19SQU5HRV9TVVBQT1JUKSB7XG4gICAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRGcm9tUmFuZ2Uoc3RyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRGcm9tV3JhcChzdHIpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0d28gbm9kZSdzIG5hbWVzIGFyZSB0aGUgc2FtZS5cbiAqXG4gKiBOT1RFOiBXZSBkb24ndCBib3RoZXIgY2hlY2tpbmcgYG5hbWVzcGFjZVVSSWAgYmVjYXVzZSB5b3Ugd2lsbCBuZXZlciBmaW5kIHR3byBIVE1MIGVsZW1lbnRzIHdpdGggdGhlIHNhbWVcbiAqICAgICAgIG5vZGVOYW1lIGFuZCBkaWZmZXJlbnQgbmFtZXNwYWNlIFVSSXMuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBhXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGIgVGhlIHRhcmdldCBlbGVtZW50XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBjb21wYXJlTm9kZU5hbWVzKGZyb21FbCwgdG9FbCkge1xuICAgIHZhciBmcm9tTm9kZU5hbWUgPSBmcm9tRWwubm9kZU5hbWU7XG4gICAgdmFyIHRvTm9kZU5hbWUgPSB0b0VsLm5vZGVOYW1lO1xuICAgIHZhciBmcm9tQ29kZVN0YXJ0LCB0b0NvZGVTdGFydDtcblxuICAgIGlmIChmcm9tTm9kZU5hbWUgPT09IHRvTm9kZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnJvbUNvZGVTdGFydCA9IGZyb21Ob2RlTmFtZS5jaGFyQ29kZUF0KDApO1xuICAgIHRvQ29kZVN0YXJ0ID0gdG9Ob2RlTmFtZS5jaGFyQ29kZUF0KDApO1xuXG4gICAgLy8gSWYgdGhlIHRhcmdldCBlbGVtZW50IGlzIGEgdmlydHVhbCBET00gbm9kZSBvciBTVkcgbm9kZSB0aGVuIHdlIG1heVxuICAgIC8vIG5lZWQgdG8gbm9ybWFsaXplIHRoZSB0YWcgbmFtZSBiZWZvcmUgY29tcGFyaW5nLiBOb3JtYWwgSFRNTCBlbGVtZW50cyB0aGF0IGFyZVxuICAgIC8vIGluIHRoZSBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIlxuICAgIC8vIGFyZSBjb252ZXJ0ZWQgdG8gdXBwZXIgY2FzZVxuICAgIGlmIChmcm9tQ29kZVN0YXJ0IDw9IDkwICYmIHRvQ29kZVN0YXJ0ID49IDk3KSB7IC8vIGZyb20gaXMgdXBwZXIgYW5kIHRvIGlzIGxvd2VyXG4gICAgICAgIHJldHVybiBmcm9tTm9kZU5hbWUgPT09IHRvTm9kZU5hbWUudG9VcHBlckNhc2UoKTtcbiAgICB9IGVsc2UgaWYgKHRvQ29kZVN0YXJ0IDw9IDkwICYmIGZyb21Db2RlU3RhcnQgPj0gOTcpIHsgLy8gdG8gaXMgdXBwZXIgYW5kIGZyb20gaXMgbG93ZXJcbiAgICAgICAgcmV0dXJuIHRvTm9kZU5hbWUgPT09IGZyb21Ob2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIGVsZW1lbnQsIG9wdGlvbmFsbHkgd2l0aCBhIGtub3duIG5hbWVzcGFjZSBVUkkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIGVsZW1lbnQgbmFtZSwgZS5nLiAnZGl2JyBvciAnc3ZnJ1xuICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lc3BhY2VVUkldIHRoZSBlbGVtZW50J3MgbmFtZXNwYWNlIFVSSSwgaS5lLiB0aGUgdmFsdWUgb2ZcbiAqIGl0cyBgeG1sbnNgIGF0dHJpYnV0ZSBvciBpdHMgaW5mZXJyZWQgbmFtZXNwYWNlLlxuICpcbiAqIEByZXR1cm4ge0VsZW1lbnR9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnROUyhuYW1lLCBuYW1lc3BhY2VVUkkpIHtcbiAgICByZXR1cm4gIW5hbWVzcGFjZVVSSSB8fCBuYW1lc3BhY2VVUkkgPT09IE5TX1hIVE1MID9cbiAgICAgICAgZG9jLmNyZWF0ZUVsZW1lbnQobmFtZSkgOlxuICAgICAgICBkb2MuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSwgbmFtZSk7XG59XG5cbi8qKlxuICogQ29waWVzIHRoZSBjaGlsZHJlbiBvZiBvbmUgRE9NIGVsZW1lbnQgdG8gYW5vdGhlciBET00gZWxlbWVudFxuICovXG5mdW5jdGlvbiBtb3ZlQ2hpbGRyZW4oZnJvbUVsLCB0b0VsKSB7XG4gICAgdmFyIGN1ckNoaWxkID0gZnJvbUVsLmZpcnN0Q2hpbGQ7XG4gICAgd2hpbGUgKGN1ckNoaWxkKSB7XG4gICAgICAgIHZhciBuZXh0Q2hpbGQgPSBjdXJDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgdG9FbC5hcHBlbmRDaGlsZChjdXJDaGlsZCk7XG4gICAgICAgIGN1ckNoaWxkID0gbmV4dENoaWxkO1xuICAgIH1cbiAgICByZXR1cm4gdG9FbDtcbn1cblxuZnVuY3Rpb24gc3luY0Jvb2xlYW5BdHRyUHJvcChmcm9tRWwsIHRvRWwsIG5hbWUpIHtcbiAgICBpZiAoZnJvbUVsW25hbWVdICE9PSB0b0VsW25hbWVdKSB7XG4gICAgICAgIGZyb21FbFtuYW1lXSA9IHRvRWxbbmFtZV07XG4gICAgICAgIGlmIChmcm9tRWxbbmFtZV0pIHtcbiAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUobmFtZSwgJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnJvbUVsLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxudmFyIHNwZWNpYWxFbEhhbmRsZXJzID0ge1xuICAgIE9QVElPTjogZnVuY3Rpb24oZnJvbUVsLCB0b0VsKSB7XG4gICAgICAgIHZhciBwYXJlbnROb2RlID0gZnJvbUVsLnBhcmVudE5vZGU7XG4gICAgICAgIGlmIChwYXJlbnROb2RlKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50TmFtZSA9IHBhcmVudE5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnROYW1lID09PSAnT1BUR1JPVVAnKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICBwYXJlbnROYW1lID0gcGFyZW50Tm9kZSAmJiBwYXJlbnROb2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFyZW50TmFtZSA9PT0gJ1NFTEVDVCcgJiYgIXBhcmVudE5vZGUuaGFzQXR0cmlidXRlKCdtdWx0aXBsZScpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZyb21FbC5oYXNBdHRyaWJ1dGUoJ3NlbGVjdGVkJykgJiYgIXRvRWwuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgTVMgRWRnZSBidWcgd2hlcmUgdGhlICdzZWxlY3RlZCcgYXR0cmlidXRlIGNhbiBvbmx5IGJlXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZWQgaWYgc2V0IHRvIGEgbm9uLWVtcHR5IHZhbHVlOlxuICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5taWNyb3NvZnQuY29tL2VuLXVzL21pY3Jvc29mdC1lZGdlL3BsYXRmb3JtL2lzc3Vlcy8xMjA4NzY3OS9cbiAgICAgICAgICAgICAgICAgICAgZnJvbUVsLnNldEF0dHJpYnV0ZSgnc2VsZWN0ZWQnLCAnc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgZnJvbUVsLnJlbW92ZUF0dHJpYnV0ZSgnc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byByZXNldCBzZWxlY3QgZWxlbWVudCdzIHNlbGVjdGVkSW5kZXggdG8gLTEsIG90aGVyd2lzZSBzZXR0aW5nXG4gICAgICAgICAgICAgICAgLy8gZnJvbUVsLnNlbGVjdGVkIHVzaW5nIHRoZSBzeW5jQm9vbGVhbkF0dHJQcm9wIGJlbG93IGhhcyBubyBlZmZlY3QuXG4gICAgICAgICAgICAgICAgLy8gVGhlIGNvcnJlY3Qgc2VsZWN0ZWRJbmRleCB3aWxsIGJlIHNldCBpbiB0aGUgU0VMRUNUIHNwZWNpYWwgaGFuZGxlciBiZWxvdy5cbiAgICAgICAgICAgICAgICBwYXJlbnROb2RlLnNlbGVjdGVkSW5kZXggPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzeW5jQm9vbGVhbkF0dHJQcm9wKGZyb21FbCwgdG9FbCwgJ3NlbGVjdGVkJyk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBUaGUgXCJ2YWx1ZVwiIGF0dHJpYnV0ZSBpcyBzcGVjaWFsIGZvciB0aGUgPGlucHV0PiBlbGVtZW50IHNpbmNlIGl0IHNldHNcbiAgICAgKiB0aGUgaW5pdGlhbCB2YWx1ZS4gQ2hhbmdpbmcgdGhlIFwidmFsdWVcIiBhdHRyaWJ1dGUgd2l0aG91dCBjaGFuZ2luZyB0aGVcbiAgICAgKiBcInZhbHVlXCIgcHJvcGVydHkgd2lsbCBoYXZlIG5vIGVmZmVjdCBzaW5jZSBpdCBpcyBvbmx5IHVzZWQgdG8gdGhlIHNldCB0aGVcbiAgICAgKiBpbml0aWFsIHZhbHVlLiAgU2ltaWxhciBmb3IgdGhlIFwiY2hlY2tlZFwiIGF0dHJpYnV0ZSwgYW5kIFwiZGlzYWJsZWRcIi5cbiAgICAgKi9cbiAgICBJTlBVVDogZnVuY3Rpb24oZnJvbUVsLCB0b0VsKSB7XG4gICAgICAgIHN5bmNCb29sZWFuQXR0clByb3AoZnJvbUVsLCB0b0VsLCAnY2hlY2tlZCcpO1xuICAgICAgICBzeW5jQm9vbGVhbkF0dHJQcm9wKGZyb21FbCwgdG9FbCwgJ2Rpc2FibGVkJyk7XG5cbiAgICAgICAgaWYgKGZyb21FbC52YWx1ZSAhPT0gdG9FbC52YWx1ZSkge1xuICAgICAgICAgICAgZnJvbUVsLnZhbHVlID0gdG9FbC52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdG9FbC5oYXNBdHRyaWJ1dGUoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgIGZyb21FbC5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgVEVYVEFSRUE6IGZ1bmN0aW9uKGZyb21FbCwgdG9FbCkge1xuICAgICAgICB2YXIgbmV3VmFsdWUgPSB0b0VsLnZhbHVlO1xuICAgICAgICBpZiAoZnJvbUVsLnZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgZnJvbUVsLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZmlyc3RDaGlsZCA9IGZyb21FbC5maXJzdENoaWxkO1xuICAgICAgICBpZiAoZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgLy8gTmVlZGVkIGZvciBJRS4gQXBwYXJlbnRseSBJRSBzZXRzIHRoZSBwbGFjZWhvbGRlciBhcyB0aGVcbiAgICAgICAgICAgIC8vIG5vZGUgdmFsdWUgYW5kIHZpc2UgdmVyc2EuIFRoaXMgaWdub3JlcyBhbiBlbXB0eSB1cGRhdGUuXG4gICAgICAgICAgICB2YXIgb2xkVmFsdWUgPSBmaXJzdENoaWxkLm5vZGVWYWx1ZTtcblxuICAgICAgICAgICAgaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlIHx8ICghbmV3VmFsdWUgJiYgb2xkVmFsdWUgPT0gZnJvbUVsLnBsYWNlaG9sZGVyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmlyc3RDaGlsZC5ub2RlVmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgU0VMRUNUOiBmdW5jdGlvbihmcm9tRWwsIHRvRWwpIHtcbiAgICAgICAgaWYgKCF0b0VsLmhhc0F0dHJpYnV0ZSgnbXVsdGlwbGUnKSkge1xuICAgICAgICAgICAgdmFyIHNlbGVjdGVkSW5kZXggPSAtMTtcbiAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gbG9vcCB0aHJvdWdoIGNoaWxkcmVuIG9mIGZyb21FbCwgbm90IHRvRWwgc2luY2Ugbm9kZXMgY2FuIGJlIG1vdmVkXG4gICAgICAgICAgICAvLyBmcm9tIHRvRWwgdG8gZnJvbUVsIGRpcmVjdGx5IHdoZW4gbW9ycGhpbmcuXG4gICAgICAgICAgICAvLyBBdCB0aGUgdGltZSB0aGlzIHNwZWNpYWwgaGFuZGxlciBpcyBpbnZva2VkLCBhbGwgY2hpbGRyZW4gaGF2ZSBhbHJlYWR5IGJlZW4gbW9ycGhlZFxuICAgICAgICAgICAgLy8gYW5kIGFwcGVuZGVkIHRvIC8gcmVtb3ZlZCBmcm9tIGZyb21FbCwgc28gdXNpbmcgZnJvbUVsIGhlcmUgaXMgc2FmZSBhbmQgY29ycmVjdC5cbiAgICAgICAgICAgIHZhciBjdXJDaGlsZCA9IGZyb21FbC5maXJzdENoaWxkO1xuICAgICAgICAgICAgdmFyIG9wdGdyb3VwO1xuICAgICAgICAgICAgdmFyIG5vZGVOYW1lO1xuICAgICAgICAgICAgd2hpbGUoY3VyQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICBub2RlTmFtZSA9IGN1ckNoaWxkLm5vZGVOYW1lICYmIGN1ckNoaWxkLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnT1BUR1JPVVAnKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGdyb3VwID0gY3VyQ2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGN1ckNoaWxkID0gb3B0Z3JvdXAuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdPUFRJT04nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hpbGQuaGFzQXR0cmlidXRlKCdzZWxlY3RlZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3VyQ2hpbGQgPSBjdXJDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJDaGlsZCAmJiBvcHRncm91cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyQ2hpbGQgPSBvcHRncm91cC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGdyb3VwID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnJvbUVsLnNlbGVjdGVkSW5kZXggPSBzZWxlY3RlZEluZGV4O1xuICAgICAgICB9XG4gICAgfVxufTtcblxudmFyIEVMRU1FTlRfTk9ERSA9IDE7XG52YXIgRE9DVU1FTlRfRlJBR01FTlRfTk9ERSQxID0gMTE7XG52YXIgVEVYVF9OT0RFID0gMztcbnZhciBDT01NRU5UX05PREUgPSA4O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxuZnVuY3Rpb24gZGVmYXVsdEdldE5vZGVLZXkobm9kZSkge1xuICBpZiAobm9kZSkge1xuICAgICAgcmV0dXJuIChub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZSgnaWQnKSkgfHwgbm9kZS5pZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3JwaGRvbUZhY3RvcnkobW9ycGhBdHRycykge1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG1vcnBoZG9tKGZyb21Ob2RlLCB0b05vZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRvTm9kZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChmcm9tTm9kZS5ub2RlTmFtZSA9PT0gJyNkb2N1bWVudCcgfHwgZnJvbU5vZGUubm9kZU5hbWUgPT09ICdIVE1MJyB8fCBmcm9tTm9kZS5ub2RlTmFtZSA9PT0gJ0JPRFknKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRvTm9kZUh0bWwgPSB0b05vZGU7XG4gICAgICAgICAgICAgICAgdG9Ob2RlID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2h0bWwnKTtcbiAgICAgICAgICAgICAgICB0b05vZGUuaW5uZXJIVE1MID0gdG9Ob2RlSHRtbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG9Ob2RlID0gdG9FbGVtZW50KHRvTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZ2V0Tm9kZUtleSA9IG9wdGlvbnMuZ2V0Tm9kZUtleSB8fCBkZWZhdWx0R2V0Tm9kZUtleTtcbiAgICAgICAgdmFyIG9uQmVmb3JlTm9kZUFkZGVkID0gb3B0aW9ucy5vbkJlZm9yZU5vZGVBZGRlZCB8fCBub29wO1xuICAgICAgICB2YXIgb25Ob2RlQWRkZWQgPSBvcHRpb25zLm9uTm9kZUFkZGVkIHx8IG5vb3A7XG4gICAgICAgIHZhciBvbkJlZm9yZUVsVXBkYXRlZCA9IG9wdGlvbnMub25CZWZvcmVFbFVwZGF0ZWQgfHwgbm9vcDtcbiAgICAgICAgdmFyIG9uRWxVcGRhdGVkID0gb3B0aW9ucy5vbkVsVXBkYXRlZCB8fCBub29wO1xuICAgICAgICB2YXIgb25CZWZvcmVOb2RlRGlzY2FyZGVkID0gb3B0aW9ucy5vbkJlZm9yZU5vZGVEaXNjYXJkZWQgfHwgbm9vcDtcbiAgICAgICAgdmFyIG9uTm9kZURpc2NhcmRlZCA9IG9wdGlvbnMub25Ob2RlRGlzY2FyZGVkIHx8IG5vb3A7XG4gICAgICAgIHZhciBvbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkID0gb3B0aW9ucy5vbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkIHx8IG5vb3A7XG4gICAgICAgIHZhciBjaGlsZHJlbk9ubHkgPSBvcHRpb25zLmNoaWxkcmVuT25seSA9PT0gdHJ1ZTtcblxuICAgICAgICAvLyBUaGlzIG9iamVjdCBpcyB1c2VkIGFzIGEgbG9va3VwIHRvIHF1aWNrbHkgZmluZCBhbGwga2V5ZWQgZWxlbWVudHMgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlLlxuICAgICAgICB2YXIgZnJvbU5vZGVzTG9va3VwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdmFyIGtleWVkUmVtb3ZhbExpc3QgPSBbXTtcblxuICAgICAgICBmdW5jdGlvbiBhZGRLZXllZFJlbW92YWwoa2V5KSB7XG4gICAgICAgICAgICBrZXllZFJlbW92YWxMaXN0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHdhbGtEaXNjYXJkZWRDaGlsZE5vZGVzKG5vZGUsIHNraXBLZXllZE5vZGVzKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgdmFyIGN1ckNoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIHdoaWxlIChjdXJDaGlsZCkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNraXBLZXllZE5vZGVzICYmIChrZXkgPSBnZXROb2RlS2V5KGN1ckNoaWxkKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBza2lwcGluZyBrZXllZCBub2RlcyB0aGVuIHdlIGFkZCB0aGUga2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhIGxpc3Qgc28gdGhhdCBpdCBjYW4gYmUgaGFuZGxlZCBhdCB0aGUgdmVyeSBlbmQuXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRLZXllZFJlbW92YWwoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgcmVwb3J0IHRoZSBub2RlIGFzIGRpc2NhcmRlZCBpZiBpdCBpcyBub3Qga2V5ZWQuIFdlIGRvIHRoaXMgYmVjYXVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQgdGhlIGVuZCB3ZSBsb29wIHRocm91Z2ggYWxsIGtleWVkIGVsZW1lbnRzIHRoYXQgd2VyZSB1bm1hdGNoZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIGRpc2NhcmQgdGhlbSBpbiBvbmUgZmluYWwgcGFzcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hpbGQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtEaXNjYXJkZWRDaGlsZE5vZGVzKGN1ckNoaWxkLCBza2lwS2V5ZWROb2Rlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZW1vdmVzIGEgRE9NIG5vZGUgb3V0IG9mIHRoZSBvcmlnaW5hbCBET01cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtICB7Tm9kZX0gbm9kZSBUaGUgbm9kZSB0byByZW1vdmVcbiAgICAgICAgICogQHBhcmFtICB7Tm9kZX0gcGFyZW50Tm9kZSBUaGUgbm9kZXMgcGFyZW50XG4gICAgICAgICAqIEBwYXJhbSAge0Jvb2xlYW59IHNraXBLZXllZE5vZGVzIElmIHRydWUgdGhlbiBlbGVtZW50cyB3aXRoIGtleXMgd2lsbCBiZSBza2lwcGVkIGFuZCBub3QgZGlzY2FyZGVkLlxuICAgICAgICAgKiBAcmV0dXJuIHt1bmRlZmluZWR9XG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiByZW1vdmVOb2RlKG5vZGUsIHBhcmVudE5vZGUsIHNraXBLZXllZE5vZGVzKSB7XG4gICAgICAgICAgICBpZiAob25CZWZvcmVOb2RlRGlzY2FyZGVkKG5vZGUpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvbk5vZGVEaXNjYXJkZWQobm9kZSk7XG4gICAgICAgICAgICB3YWxrRGlzY2FyZGVkQ2hpbGROb2Rlcyhub2RlLCBza2lwS2V5ZWROb2Rlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAvLyBUcmVlV2Fsa2VyIGltcGxlbWVudGF0aW9uIGlzIG5vIGZhc3RlciwgYnV0IGtlZXBpbmcgdGhpcyBhcm91bmQgaW4gY2FzZSB0aGlzIGNoYW5nZXMgaW4gdGhlIGZ1dHVyZVxuICAgICAgICAvLyBmdW5jdGlvbiBpbmRleFRyZWUocm9vdCkge1xuICAgICAgICAvLyAgICAgdmFyIHRyZWVXYWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKFxuICAgICAgICAvLyAgICAgICAgIHJvb3QsXG4gICAgICAgIC8vICAgICAgICAgTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgdmFyIGVsO1xuICAgICAgICAvLyAgICAgd2hpbGUoKGVsID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpKSkge1xuICAgICAgICAvLyAgICAgICAgIHZhciBrZXkgPSBnZXROb2RlS2V5KGVsKTtcbiAgICAgICAgLy8gICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgIC8vICAgICAgICAgICAgIGZyb21Ob2Rlc0xvb2t1cFtrZXldID0gZWw7XG4gICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gLy8gTm9kZUl0ZXJhdG9yIGltcGxlbWVudGF0aW9uIGlzIG5vIGZhc3RlciwgYnV0IGtlZXBpbmcgdGhpcyBhcm91bmQgaW4gY2FzZSB0aGlzIGNoYW5nZXMgaW4gdGhlIGZ1dHVyZVxuICAgICAgICAvL1xuICAgICAgICAvLyBmdW5jdGlvbiBpbmRleFRyZWUobm9kZSkge1xuICAgICAgICAvLyAgICAgdmFyIG5vZGVJdGVyYXRvciA9IGRvY3VtZW50LmNyZWF0ZU5vZGVJdGVyYXRvcihub2RlLCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCk7XG4gICAgICAgIC8vICAgICB2YXIgZWw7XG4gICAgICAgIC8vICAgICB3aGlsZSgoZWwgPSBub2RlSXRlcmF0b3IubmV4dE5vZGUoKSkpIHtcbiAgICAgICAgLy8gICAgICAgICB2YXIga2V5ID0gZ2V0Tm9kZUtleShlbCk7XG4gICAgICAgIC8vICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAvLyAgICAgICAgICAgICBmcm9tTm9kZXNMb29rdXBba2V5XSA9IGVsO1xuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGZ1bmN0aW9uIGluZGV4VHJlZShub2RlKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUkMSkge1xuICAgICAgICAgICAgICAgIHZhciBjdXJDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoY3VyQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IGdldE5vZGVLZXkoY3VyQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tTm9kZXNMb29rdXBba2V5XSA9IGN1ckNoaWxkO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2FsayByZWN1cnNpdmVseVxuICAgICAgICAgICAgICAgICAgICBpbmRleFRyZWUoY3VyQ2hpbGQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGN1ckNoaWxkID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXhUcmVlKGZyb21Ob2RlKTtcblxuICAgICAgICBmdW5jdGlvbiBoYW5kbGVOb2RlQWRkZWQoZWwpIHtcbiAgICAgICAgICAgIG9uTm9kZUFkZGVkKGVsKTtcblxuICAgICAgICAgICAgdmFyIGN1ckNoaWxkID0gZWwuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIHdoaWxlIChjdXJDaGlsZCkge1xuICAgICAgICAgICAgICAgIHZhciBuZXh0U2libGluZyA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGdldE5vZGVLZXkoY3VyQ2hpbGQpO1xuICAgICAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHVubWF0Y2hlZEZyb21FbCA9IGZyb21Ob2Rlc0xvb2t1cFtrZXldO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBmaW5kIGEgZHVwbGljYXRlICNpZCBub2RlIGluIGNhY2hlLCByZXBsYWNlIGBlbGAgd2l0aCBjYWNoZSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbW9ycGggaXQgdG8gdGhlIGNoaWxkIG5vZGUuXG4gICAgICAgICAgICAgICAgICAgIGlmICh1bm1hdGNoZWRGcm9tRWwgJiYgY29tcGFyZU5vZGVOYW1lcyhjdXJDaGlsZCwgdW5tYXRjaGVkRnJvbUVsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyQ2hpbGQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodW5tYXRjaGVkRnJvbUVsLCBjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb3JwaEVsKHVubWF0Y2hlZEZyb21FbCwgY3VyQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU5vZGVBZGRlZChjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gcmVjdXJzaXZlbHkgY2FsbCBmb3IgY3VyQ2hpbGQgYW5kIGl0J3MgY2hpbGRyZW4gdG8gc2VlIGlmIHdlIGZpbmQgc29tZXRoaW5nIGluXG4gICAgICAgICAgICAgICAgICAvLyBmcm9tTm9kZXNMb29rdXBcbiAgICAgICAgICAgICAgICAgIGhhbmRsZU5vZGVBZGRlZChjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY3VyQ2hpbGQgPSBuZXh0U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGNsZWFudXBGcm9tRWwoZnJvbUVsLCBjdXJGcm9tTm9kZUNoaWxkLCBjdXJGcm9tTm9kZUtleSkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSBwcm9jZXNzZWQgYWxsIG9mIHRoZSBcInRvIG5vZGVzXCIuIElmIGN1ckZyb21Ob2RlQ2hpbGQgaXNcbiAgICAgICAgICAgIC8vIG5vbi1udWxsIHRoZW4gd2Ugc3RpbGwgaGF2ZSBzb21lIGZyb20gbm9kZXMgbGVmdCBvdmVyIHRoYXQgbmVlZFxuICAgICAgICAgICAgLy8gdG8gYmUgcmVtb3ZlZFxuICAgICAgICAgICAgd2hpbGUgKGN1ckZyb21Ob2RlQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbU5leHRTaWJsaW5nID0gY3VyRnJvbU5vZGVDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICBpZiAoKGN1ckZyb21Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJGcm9tTm9kZUNoaWxkKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlIG5vZGUgaXMga2V5ZWQgaXQgbWlnaHQgYmUgbWF0Y2hlZCB1cCBsYXRlciBzbyB3ZSBkZWZlclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHJlbW92YWwgdG8gbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgYWRkS2V5ZWRSZW1vdmFsKGN1ckZyb21Ob2RlS2V5KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiB3ZSBza2lwIG5lc3RlZCBrZXllZCBub2RlcyBmcm9tIGJlaW5nIHJlbW92ZWQgc2luY2UgdGhlcmUgaXNcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc3RpbGwgYSBjaGFuY2UgdGhleSB3aWxsIGJlIG1hdGNoZWQgdXAgbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTm9kZShjdXJGcm9tTm9kZUNoaWxkLCBmcm9tRWwsIHRydWUgLyogc2tpcCBrZXllZCBub2RlcyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBtb3JwaEVsKGZyb21FbCwgdG9FbCwgY2hpbGRyZW5Pbmx5KSB7XG4gICAgICAgICAgICB2YXIgdG9FbEtleSA9IGdldE5vZGVLZXkodG9FbCk7XG5cbiAgICAgICAgICAgIGlmICh0b0VsS2V5KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgYW4gZWxlbWVudCB3aXRoIGFuIElEIGlzIGJlaW5nIG1vcnBoZWQgdGhlbiBpdCB3aWxsIGJlIGluIHRoZSBmaW5hbFxuICAgICAgICAgICAgICAgIC8vIERPTSBzbyBjbGVhciBpdCBvdXQgb2YgdGhlIHNhdmVkIGVsZW1lbnRzIGNvbGxlY3Rpb25cbiAgICAgICAgICAgICAgICBkZWxldGUgZnJvbU5vZGVzTG9va3VwW3RvRWxLZXldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWNoaWxkcmVuT25seSkge1xuICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsXG4gICAgICAgICAgICAgICAgaWYgKG9uQmVmb3JlRWxVcGRhdGVkKGZyb21FbCwgdG9FbCkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgYXR0cmlidXRlcyBvbiBvcmlnaW5hbCBET00gZWxlbWVudCBmaXJzdFxuICAgICAgICAgICAgICAgIG1vcnBoQXR0cnMoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICAgICAgICAvLyBvcHRpb25hbFxuICAgICAgICAgICAgICAgIG9uRWxVcGRhdGVkKGZyb21FbCk7XG5cbiAgICAgICAgICAgICAgICBpZiAob25CZWZvcmVFbENoaWxkcmVuVXBkYXRlZChmcm9tRWwsIHRvRWwpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZnJvbUVsLm5vZGVOYW1lICE9PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgICAgICAgIG1vcnBoQ2hpbGRyZW4oZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNwZWNpYWxFbEhhbmRsZXJzLlRFWFRBUkVBKGZyb21FbCwgdG9FbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBtb3JwaENoaWxkcmVuKGZyb21FbCwgdG9FbCkge1xuICAgICAgICAgICAgdmFyIGN1clRvTm9kZUNoaWxkID0gdG9FbC5maXJzdENoaWxkO1xuICAgICAgICAgICAgdmFyIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tRWwuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIHZhciBjdXJUb05vZGVLZXk7XG4gICAgICAgICAgICB2YXIgY3VyRnJvbU5vZGVLZXk7XG5cbiAgICAgICAgICAgIHZhciBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB2YXIgdG9OZXh0U2libGluZztcbiAgICAgICAgICAgIHZhciBtYXRjaGluZ0Zyb21FbDtcblxuICAgICAgICAgICAgLy8gd2FsayB0aGUgY2hpbGRyZW5cbiAgICAgICAgICAgIG91dGVyOiB3aGlsZSAoY3VyVG9Ob2RlQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICB0b05leHRTaWJsaW5nID0gY3VyVG9Ob2RlQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgY3VyVG9Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJUb05vZGVDaGlsZCk7XG5cbiAgICAgICAgICAgICAgICAvLyB3YWxrIHRoZSBmcm9tTm9kZSBjaGlsZHJlbiBhbGwgdGhlIHdheSB0aHJvdWdoXG4gICAgICAgICAgICAgICAgd2hpbGUgKGN1ckZyb21Ob2RlQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbU5leHRTaWJsaW5nID0gY3VyRnJvbU5vZGVDaGlsZC5uZXh0U2libGluZztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVG9Ob2RlQ2hpbGQuaXNTYW1lTm9kZSAmJiBjdXJUb05vZGVDaGlsZC5pc1NhbWVOb2RlKGN1ckZyb21Ob2RlQ2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJUb05vZGVDaGlsZCA9IHRvTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbU5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjdXJGcm9tTm9kZUtleSA9IGdldE5vZGVLZXkoY3VyRnJvbU5vZGVDaGlsZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGN1ckZyb21Ob2RlVHlwZSA9IGN1ckZyb21Ob2RlQ2hpbGQubm9kZVR5cGU7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBtZWFucyBpZiB0aGUgY3VyRnJvbU5vZGVDaGlsZCBkb2VzbnQgaGF2ZSBhIG1hdGNoIHdpdGggdGhlIGN1clRvTm9kZUNoaWxkXG4gICAgICAgICAgICAgICAgICAgIHZhciBpc0NvbXBhdGlibGUgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckZyb21Ob2RlVHlwZSA9PT0gY3VyVG9Ob2RlQ2hpbGQubm9kZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJGcm9tTm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJvdGggbm9kZXMgYmVpbmcgY29tcGFyZWQgYXJlIEVsZW1lbnQgbm9kZXNcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJUb05vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHRhcmdldCBub2RlIGhhcyBhIGtleSBzbyB3ZSB3YW50IHRvIG1hdGNoIGl0IHVwIHdpdGggdGhlIGNvcnJlY3QgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgb3JpZ2luYWwgRE9NIHRyZWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1clRvTm9kZUtleSAhPT0gY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlIGRvZXMgbm90IGhhdmUgYSBtYXRjaGluZyBrZXkgc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxldCdzIGNoZWNrIG91ciBsb29rdXAgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERPTSB0cmVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1hdGNoaW5nRnJvbUVsID0gZnJvbU5vZGVzTG9va3VwW2N1clRvTm9kZUtleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyb21OZXh0U2libGluZyA9PT0gbWF0Y2hpbmdGcm9tRWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBzaW5nbGUgZWxlbWVudCByZW1vdmFscy4gVG8gYXZvaWQgcmVtb3ZpbmcgdGhlIG9yaWdpbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERPTSBub2RlIG91dCBvZiB0aGUgdHJlZSAoc2luY2UgdGhhdCBjYW4gYnJlYWsgQ1NTIHRyYW5zaXRpb25zLCBldGMuKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd2lsbCBpbnN0ZWFkIGRpc2NhcmQgdGhlIGN1cnJlbnQgbm9kZSBhbmQgd2FpdCB1bnRpbCB0aGUgbmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdGVyYXRpb24gdG8gcHJvcGVybHkgbWF0Y2ggdXAgdGhlIGtleWVkIHRhcmdldCBlbGVtZW50IHdpdGggaXRzIG1hdGNoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQgaW4gdGhlIG9yaWdpbmFsIHRyZWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgYSBtYXRjaGluZyBrZXllZCBlbGVtZW50IHNvbWV3aGVyZSBpbiB0aGUgb3JpZ2luYWwgRE9NIHRyZWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldCdzIG1vdmUgdGhlIG9yaWdpbmFsIERPTSBub2RlIGludG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIG1vcnBoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0LlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IFdlIHVzZSBpbnNlcnRCZWZvcmUgaW5zdGVhZCBvZiByZXBsYWNlQ2hpbGQgYmVjYXVzZSB3ZSB3YW50IHRvIGdvIHRocm91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGByZW1vdmVOb2RlKClgIGZ1bmN0aW9uIGZvciB0aGUgbm9kZSB0aGF0IGlzIGJlaW5nIGRpc2NhcmRlZCBzbyB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBsaWZlY3ljbGUgaG9va3MgYXJlIGNvcnJlY3RseSBpbnZva2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21FbC5pbnNlcnRCZWZvcmUobWF0Y2hpbmdGcm9tRWwsIGN1ckZyb21Ob2RlQ2hpbGQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb21OZXh0U2libGluZyA9IGN1ckZyb21Ob2RlQ2hpbGQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGUgbm9kZSBpcyBrZXllZCBpdCBtaWdodCBiZSBtYXRjaGVkIHVwIGxhdGVyIHNvIHdlIGRlZmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHJlbW92YWwgdG8gbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEtleWVkUmVtb3ZhbChjdXJGcm9tTm9kZUtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiB3ZSBza2lwIG5lc3RlZCBrZXllZCBub2RlcyBmcm9tIGJlaW5nIHJlbW92ZWQgc2luY2UgdGhlcmUgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHN0aWxsIGEgY2hhbmNlIHRoZXkgd2lsbCBiZSBtYXRjaGVkIHVwIGxhdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKGN1ckZyb21Ob2RlQ2hpbGQsIGZyb21FbCwgdHJ1ZSAvKiBza2lwIGtleWVkIG5vZGVzICovKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBtYXRjaGluZ0Zyb21FbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBub2RlcyBhcmUgbm90IGNvbXBhdGlibGUgc2luY2UgdGhlIFwidG9cIiBub2RlIGhhcyBhIGtleSBhbmQgdGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBubyBtYXRjaGluZyBrZXllZCBub2RlIGluIHRoZSBzb3VyY2UgdHJlZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGF0aWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJGcm9tTm9kZUtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgb3JpZ2luYWwgaGFzIGEga2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGF0aWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGF0aWJsZSA9IGlzQ29tcGF0aWJsZSAhPT0gZmFsc2UgJiYgY29tcGFyZU5vZGVOYW1lcyhjdXJGcm9tTm9kZUNoaWxkLCBjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29tcGF0aWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCBjb21wYXRpYmxlIERPTSBlbGVtZW50cyBzbyB0cmFuc2Zvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgXCJmcm9tXCIgbm9kZSB0byBtYXRjaCB0aGUgY3VycmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YXJnZXQgRE9NIG5vZGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1PUlBIXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcnBoRWwoY3VyRnJvbU5vZGVDaGlsZCwgY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJGcm9tTm9kZVR5cGUgPT09IFRFWFRfTk9ERSB8fCBjdXJGcm9tTm9kZVR5cGUgPT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQm90aCBub2RlcyBiZWluZyBjb21wYXJlZCBhcmUgVGV4dCBvciBDb21tZW50IG5vZGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbHkgdXBkYXRlIG5vZGVWYWx1ZSBvbiB0aGUgb3JpZ2luYWwgbm9kZSB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZSB0aGUgdGV4dCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJGcm9tTm9kZUNoaWxkLm5vZGVWYWx1ZSAhPT0gY3VyVG9Ob2RlQ2hpbGQubm9kZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQubm9kZVZhbHVlID0gY3VyVG9Ob2RlQ2hpbGQubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29tcGF0aWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWR2YW5jZSBib3RoIHRoZSBcInRvXCIgY2hpbGQgYW5kIHRoZSBcImZyb21cIiBjaGlsZCBzaW5jZSB3ZSBmb3VuZCBhIG1hdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIGVsc2UgdG8gZG8gYXMgd2UgYWxyZWFkeSByZWN1cnNpdmVseSBjYWxsZWQgbW9ycGhDaGlsZHJlbiBhYm92ZVxuICAgICAgICAgICAgICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSB0b05leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IGZyb21OZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTm8gY29tcGF0aWJsZSBtYXRjaCBzbyByZW1vdmUgdGhlIG9sZCBub2RlIGZyb20gdGhlIERPTSBhbmQgY29udGludWUgdHJ5aW5nIHRvIGZpbmQgYVxuICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaCBpbiB0aGUgb3JpZ2luYWwgRE9NLiBIb3dldmVyLCB3ZSBvbmx5IGRvIHRoaXMgaWYgdGhlIGZyb20gbm9kZSBpcyBub3Qga2V5ZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgaXQgaXMgcG9zc2libGUgdGhhdCBhIGtleWVkIG5vZGUgbWlnaHQgbWF0Y2ggdXAgd2l0aCBhIG5vZGUgc29tZXdoZXJlIGVsc2UgaW4gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHRhcmdldCB0cmVlIGFuZCB3ZSBkb24ndCB3YW50IHRvIGRpc2NhcmQgaXQganVzdCB5ZXQgc2luY2UgaXQgc3RpbGwgbWlnaHQgZmluZCBhXG4gICAgICAgICAgICAgICAgICAgIC8vIGhvbWUgaW4gdGhlIGZpbmFsIERPTSB0cmVlLiBBZnRlciBldmVyeXRoaW5nIGlzIGRvbmUgd2Ugd2lsbCByZW1vdmUgYW55IGtleWVkIG5vZGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgZGlkbid0IGZpbmQgYSBob21lXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJGcm9tTm9kZUtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlIG5vZGUgaXMga2V5ZWQgaXQgbWlnaHQgYmUgbWF0Y2hlZCB1cCBsYXRlciBzbyB3ZSBkZWZlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFjdHVhbCByZW1vdmFsIHRvIGxhdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRLZXllZFJlbW92YWwoY3VyRnJvbU5vZGVLZXkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogd2Ugc2tpcCBuZXN0ZWQga2V5ZWQgbm9kZXMgZnJvbSBiZWluZyByZW1vdmVkIHNpbmNlIHRoZXJlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzdGlsbCBhIGNoYW5jZSB0aGV5IHdpbGwgYmUgbWF0Y2hlZCB1cCBsYXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTm9kZShjdXJGcm9tTm9kZUNoaWxkLCBmcm9tRWwsIHRydWUgLyogc2tpcCBrZXllZCBub2RlcyAqLyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbU5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH0gLy8gRU5EOiB3aGlsZShjdXJGcm9tTm9kZUNoaWxkKSB7fVxuXG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgZ290IHRoaXMgZmFyIHRoZW4gd2UgZGlkIG5vdCBmaW5kIGEgY2FuZGlkYXRlIG1hdGNoIGZvclxuICAgICAgICAgICAgICAgIC8vIG91ciBcInRvIG5vZGVcIiBhbmQgd2UgZXhoYXVzdGVkIGFsbCBvZiB0aGUgY2hpbGRyZW4gXCJmcm9tXCJcbiAgICAgICAgICAgICAgICAvLyBub2Rlcy4gVGhlcmVmb3JlLCB3ZSB3aWxsIGp1c3QgYXBwZW5kIHRoZSBjdXJyZW50IFwidG9cIiBub2RlXG4gICAgICAgICAgICAgICAgLy8gdG8gdGhlIGVuZFxuICAgICAgICAgICAgICAgIGlmIChjdXJUb05vZGVLZXkgJiYgKG1hdGNoaW5nRnJvbUVsID0gZnJvbU5vZGVzTG9va3VwW2N1clRvTm9kZUtleV0pICYmIGNvbXBhcmVOb2RlTmFtZXMobWF0Y2hpbmdGcm9tRWwsIGN1clRvTm9kZUNoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICBmcm9tRWwuYXBwZW5kQ2hpbGQobWF0Y2hpbmdGcm9tRWwpO1xuICAgICAgICAgICAgICAgICAgICAvLyBNT1JQSFxuICAgICAgICAgICAgICAgICAgICBtb3JwaEVsKG1hdGNoaW5nRnJvbUVsLCBjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9uQmVmb3JlTm9kZUFkZGVkUmVzdWx0ID0gb25CZWZvcmVOb2RlQWRkZWQoY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAob25CZWZvcmVOb2RlQWRkZWRSZXN1bHQgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob25CZWZvcmVOb2RlQWRkZWRSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJUb05vZGVDaGlsZCA9IG9uQmVmb3JlTm9kZUFkZGVkUmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVG9Ob2RlQ2hpbGQuYWN0dWFsaXplKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSBjdXJUb05vZGVDaGlsZC5hY3R1YWxpemUoZnJvbUVsLm93bmVyRG9jdW1lbnQgfHwgZG9jKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb21FbC5hcHBlbmRDaGlsZChjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVOb2RlQWRkZWQoY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSB0b05leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNsZWFudXBGcm9tRWwoZnJvbUVsLCBjdXJGcm9tTm9kZUNoaWxkLCBjdXJGcm9tTm9kZUtleSk7XG5cbiAgICAgICAgICAgIHZhciBzcGVjaWFsRWxIYW5kbGVyID0gc3BlY2lhbEVsSGFuZGxlcnNbZnJvbUVsLm5vZGVOYW1lXTtcbiAgICAgICAgICAgIGlmIChzcGVjaWFsRWxIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgc3BlY2lhbEVsSGFuZGxlcihmcm9tRWwsIHRvRWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IC8vIEVORDogbW9ycGhDaGlsZHJlbiguLi4pXG5cbiAgICAgICAgdmFyIG1vcnBoZWROb2RlID0gZnJvbU5vZGU7XG4gICAgICAgIHZhciBtb3JwaGVkTm9kZVR5cGUgPSBtb3JwaGVkTm9kZS5ub2RlVHlwZTtcbiAgICAgICAgdmFyIHRvTm9kZVR5cGUgPSB0b05vZGUubm9kZVR5cGU7XG5cbiAgICAgICAgaWYgKCFjaGlsZHJlbk9ubHkpIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBhcmUgZ2l2ZW4gdHdvIERPTSBub2RlcyB0aGF0IGFyZSBub3RcbiAgICAgICAgICAgIC8vIGNvbXBhdGlibGUgKGUuZy4gPGRpdj4gLS0+IDxzcGFuPiBvciA8ZGl2PiAtLT4gVEVYVClcbiAgICAgICAgICAgIGlmIChtb3JwaGVkTm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgIGlmICh0b05vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21wYXJlTm9kZU5hbWVzKGZyb21Ob2RlLCB0b05vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbk5vZGVEaXNjYXJkZWQoZnJvbU5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9ycGhlZE5vZGUgPSBtb3ZlQ2hpbGRyZW4oZnJvbU5vZGUsIGNyZWF0ZUVsZW1lbnROUyh0b05vZGUubm9kZU5hbWUsIHRvTm9kZS5uYW1lc3BhY2VVUkkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEdvaW5nIGZyb20gYW4gZWxlbWVudCBub2RlIHRvIGEgdGV4dCBub2RlXG4gICAgICAgICAgICAgICAgICAgIG1vcnBoZWROb2RlID0gdG9Ob2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW9ycGhlZE5vZGVUeXBlID09PSBURVhUX05PREUgfHwgbW9ycGhlZE5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHsgLy8gVGV4dCBvciBjb21tZW50IG5vZGVcbiAgICAgICAgICAgICAgICBpZiAodG9Ob2RlVHlwZSA9PT0gbW9ycGhlZE5vZGVUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb3JwaGVkTm9kZS5ub2RlVmFsdWUgIT09IHRvTm9kZS5ub2RlVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vcnBoZWROb2RlLm5vZGVWYWx1ZSA9IHRvTm9kZS5ub2RlVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9ycGhlZE5vZGU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGV4dCBub2RlIHRvIHNvbWV0aGluZyBlbHNlXG4gICAgICAgICAgICAgICAgICAgIG1vcnBoZWROb2RlID0gdG9Ob2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb3JwaGVkTm9kZSA9PT0gdG9Ob2RlKSB7XG4gICAgICAgICAgICAvLyBUaGUgXCJ0byBub2RlXCIgd2FzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIFwiZnJvbSBub2RlXCIgc28gd2UgaGFkIHRvXG4gICAgICAgICAgICAvLyB0b3NzIG91dCB0aGUgXCJmcm9tIG5vZGVcIiBhbmQgdXNlIHRoZSBcInRvIG5vZGVcIlxuICAgICAgICAgICAgb25Ob2RlRGlzY2FyZGVkKGZyb21Ob2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0b05vZGUuaXNTYW1lTm9kZSAmJiB0b05vZGUuaXNTYW1lTm9kZShtb3JwaGVkTm9kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1vcnBoRWwobW9ycGhlZE5vZGUsIHRvTm9kZSwgY2hpbGRyZW5Pbmx5KTtcblxuICAgICAgICAgICAgLy8gV2Ugbm93IG5lZWQgdG8gbG9vcCBvdmVyIGFueSBrZXllZCBub2RlcyB0aGF0IG1pZ2h0IG5lZWQgdG8gYmVcbiAgICAgICAgICAgIC8vIHJlbW92ZWQuIFdlIG9ubHkgZG8gdGhlIHJlbW92YWwgaWYgd2Uga25vdyB0aGF0IHRoZSBrZXllZCBub2RlXG4gICAgICAgICAgICAvLyBuZXZlciBmb3VuZCBhIG1hdGNoLiBXaGVuIGEga2V5ZWQgbm9kZSBpcyBtYXRjaGVkIHVwIHdlIHJlbW92ZVxuICAgICAgICAgICAgLy8gaXQgb3V0IG9mIGZyb21Ob2Rlc0xvb2t1cCBhbmQgd2UgdXNlIGZyb21Ob2Rlc0xvb2t1cCB0byBkZXRlcm1pbmVcbiAgICAgICAgICAgIC8vIGlmIGEga2V5ZWQgbm9kZSBoYXMgYmVlbiBtYXRjaGVkIHVwIG9yIG5vdFxuICAgICAgICAgICAgaWYgKGtleWVkUmVtb3ZhbExpc3QpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTAsIGxlbj1rZXllZFJlbW92YWxMaXN0Lmxlbmd0aDsgaTxsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZWxUb1JlbW92ZSA9IGZyb21Ob2Rlc0xvb2t1cFtrZXllZFJlbW92YWxMaXN0W2ldXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsVG9SZW1vdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUoZWxUb1JlbW92ZSwgZWxUb1JlbW92ZS5wYXJlbnROb2RlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNoaWxkcmVuT25seSAmJiBtb3JwaGVkTm9kZSAhPT0gZnJvbU5vZGUgJiYgZnJvbU5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKG1vcnBoZWROb2RlLmFjdHVhbGl6ZSkge1xuICAgICAgICAgICAgICAgIG1vcnBoZWROb2RlID0gbW9ycGhlZE5vZGUuYWN0dWFsaXplKGZyb21Ob2RlLm93bmVyRG9jdW1lbnQgfHwgZG9jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIHdlIGhhZCB0byBzd2FwIG91dCB0aGUgZnJvbSBub2RlIHdpdGggYSBuZXcgbm9kZSBiZWNhdXNlIHRoZSBvbGRcbiAgICAgICAgICAgIC8vIG5vZGUgd2FzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIHRhcmdldCBub2RlIHRoZW4gd2UgbmVlZCB0b1xuICAgICAgICAgICAgLy8gcmVwbGFjZSB0aGUgb2xkIERPTSBub2RlIGluIHRoZSBvcmlnaW5hbCBET00gdHJlZS4gVGhpcyBpcyBvbmx5XG4gICAgICAgICAgICAvLyBwb3NzaWJsZSBpZiB0aGUgb3JpZ2luYWwgRE9NIG5vZGUgd2FzIHBhcnQgb2YgYSBET00gdHJlZSB3aGljaFxuICAgICAgICAgICAgLy8gd2Uga25vdyBpcyB0aGUgY2FzZSBpZiBpdCBoYXMgYSBwYXJlbnQgbm9kZS5cbiAgICAgICAgICAgIGZyb21Ob2RlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG1vcnBoZWROb2RlLCBmcm9tTm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbW9ycGhlZE5vZGU7XG4gICAgfTtcbn1cblxudmFyIG1vcnBoZG9tID0gbW9ycGhkb21GYWN0b3J5KG1vcnBoQXR0cnMpO1xuXG5leHBvcnQgZGVmYXVsdCBtb3JwaGRvbTtcbiIsICJpbXBvcnQge1xuICBQSFhfQ09NUE9ORU5ULFxuICBQSFhfRElTQUJMRV9XSVRILFxuICBQSFhfRkVFREJBQ0tfRk9SLFxuICBQSFhfUkVNT1ZFLFxuICBQSFhfUk9PVF9JRCxcbiAgUEhYX1NFU1NJT04sXG4gIFBIWF9TS0lQLFxuICBQSFhfU1RBVElDLFxuICBQSFhfVFJJR0dFUl9BQ1RJT04sXG4gIFBIWF9VUERBVEVcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IHtcbiAgZGV0ZWN0RHVwbGljYXRlSWRzXG59IGZyb20gXCIuL3V0aWxzXCJcblxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIlxuaW1wb3J0IERPTVBvc3RNb3JwaFJlc3RvcmVyIGZyb20gXCIuL2RvbV9wb3N0X21vcnBoX3Jlc3RvcmVyXCJcbmltcG9ydCBtb3JwaGRvbSBmcm9tIFwibW9ycGhkb21cIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBET01QYXRjaCB7XG4gIHN0YXRpYyBwYXRjaEVsKGZyb21FbCwgdG9FbCwgYWN0aXZlRWxlbWVudCl7XG4gICAgbW9ycGhkb20oZnJvbUVsLCB0b0VsLCB7XG4gICAgICBjaGlsZHJlbk9ubHk6IGZhbHNlLFxuICAgICAgb25CZWZvcmVFbFVwZGF0ZWQ6IChmcm9tRWwsIHRvRWwpID0+IHtcbiAgICAgICAgaWYoYWN0aXZlRWxlbWVudCAmJiBhY3RpdmVFbGVtZW50LmlzU2FtZU5vZGUoZnJvbUVsKSAmJiBET00uaXNGb3JtSW5wdXQoZnJvbUVsKSl7XG4gICAgICAgICAgRE9NLm1lcmdlRm9jdXNlZElucHV0KGZyb21FbCwgdG9FbClcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBjb25zdHJ1Y3Rvcih2aWV3LCBjb250YWluZXIsIGlkLCBodG1sLCB0YXJnZXRDSUQpe1xuICAgIHRoaXMudmlldyA9IHZpZXdcbiAgICB0aGlzLmxpdmVTb2NrZXQgPSB2aWV3LmxpdmVTb2NrZXRcbiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lclxuICAgIHRoaXMuaWQgPSBpZFxuICAgIHRoaXMucm9vdElEID0gdmlldy5yb290LmlkXG4gICAgdGhpcy5odG1sID0gaHRtbFxuICAgIHRoaXMudGFyZ2V0Q0lEID0gdGFyZ2V0Q0lEXG4gICAgdGhpcy5jaWRQYXRjaCA9IHR5cGVvZiAodGhpcy50YXJnZXRDSUQpID09PSBcIm51bWJlclwiXG4gICAgdGhpcy5jYWxsYmFja3MgPSB7XG4gICAgICBiZWZvcmVhZGRlZDogW10sIGJlZm9yZXVwZGF0ZWQ6IFtdLCBiZWZvcmVwaHhDaGlsZEFkZGVkOiBbXSxcbiAgICAgIGFmdGVyYWRkZWQ6IFtdLCBhZnRlcnVwZGF0ZWQ6IFtdLCBhZnRlcmRpc2NhcmRlZDogW10sIGFmdGVycGh4Q2hpbGRBZGRlZDogW11cbiAgICB9XG4gIH1cblxuICBiZWZvcmUoa2luZCwgY2FsbGJhY2speyB0aGlzLmNhbGxiYWNrc1tgYmVmb3JlJHtraW5kfWBdLnB1c2goY2FsbGJhY2spIH1cbiAgYWZ0ZXIoa2luZCwgY2FsbGJhY2speyB0aGlzLmNhbGxiYWNrc1tgYWZ0ZXIke2tpbmR9YF0ucHVzaChjYWxsYmFjaykgfVxuXG4gIHRyYWNrQmVmb3JlKGtpbmQsIC4uLmFyZ3Mpe1xuICAgIHRoaXMuY2FsbGJhY2tzW2BiZWZvcmUke2tpbmR9YF0uZm9yRWFjaChjYWxsYmFjayA9PiBjYWxsYmFjayguLi5hcmdzKSlcbiAgfVxuXG4gIHRyYWNrQWZ0ZXIoa2luZCwgLi4uYXJncyl7XG4gICAgdGhpcy5jYWxsYmFja3NbYGFmdGVyJHtraW5kfWBdLmZvckVhY2goY2FsbGJhY2sgPT4gY2FsbGJhY2soLi4uYXJncykpXG4gIH1cblxuICBtYXJrUHJ1bmFibGVDb250ZW50Rm9yUmVtb3ZhbCgpe1xuICAgIERPTS5hbGwodGhpcy5jb250YWluZXIsIFwiW3BoeC11cGRhdGU9YXBwZW5kXSA+ICosIFtwaHgtdXBkYXRlPXByZXBlbmRdID4gKlwiLCBlbCA9PiB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoUEhYX1JFTU9WRSwgXCJcIilcbiAgICB9KVxuICB9XG5cbiAgcGVyZm9ybSgpe1xuICAgIGxldCB7dmlldywgbGl2ZVNvY2tldCwgY29udGFpbmVyLCBodG1sfSA9IHRoaXNcbiAgICBsZXQgdGFyZ2V0Q29udGFpbmVyID0gdGhpcy5pc0NJRFBhdGNoKCkgPyB0aGlzLnRhcmdldENJRENvbnRhaW5lcihodG1sKSA6IGNvbnRhaW5lclxuICAgIGlmKHRoaXMuaXNDSURQYXRjaCgpICYmICF0YXJnZXRDb250YWluZXIpeyByZXR1cm4gfVxuXG4gICAgbGV0IGZvY3VzZWQgPSBsaXZlU29ja2V0LmdldEFjdGl2ZUVsZW1lbnQoKVxuICAgIGxldCB7c2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZH0gPSBmb2N1c2VkICYmIERPTS5oYXNTZWxlY3Rpb25SYW5nZShmb2N1c2VkKSA/IGZvY3VzZWQgOiB7fVxuICAgIGxldCBwaHhVcGRhdGUgPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX1VQREFURSlcbiAgICBsZXQgcGh4RmVlZGJhY2tGb3IgPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX0ZFRURCQUNLX0ZPUilcbiAgICBsZXQgZGlzYWJsZVdpdGggPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX0RJU0FCTEVfV0lUSClcbiAgICBsZXQgcGh4VHJpZ2dlckV4dGVybmFsID0gbGl2ZVNvY2tldC5iaW5kaW5nKFBIWF9UUklHR0VSX0FDVElPTilcbiAgICBsZXQgYWRkZWQgPSBbXVxuICAgIGxldCB1cGRhdGVzID0gW11cbiAgICBsZXQgYXBwZW5kUHJlcGVuZFVwZGF0ZXMgPSBbXVxuICAgIGxldCBleHRlcm5hbEZvcm1UcmlnZ2VyZWQgPSBudWxsXG5cbiAgICBsZXQgZGlmZkhUTUwgPSBsaXZlU29ja2V0LnRpbWUoXCJwcmVtb3JwaCBjb250YWluZXIgcHJlcFwiLCAoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5idWlsZERpZmZIVE1MKGNvbnRhaW5lciwgaHRtbCwgcGh4VXBkYXRlLCB0YXJnZXRDb250YWluZXIpXG4gICAgfSlcblxuICAgIHRoaXMudHJhY2tCZWZvcmUoXCJhZGRlZFwiLCBjb250YWluZXIpXG4gICAgdGhpcy50cmFja0JlZm9yZShcInVwZGF0ZWRcIiwgY29udGFpbmVyLCBjb250YWluZXIpXG5cbiAgICBsaXZlU29ja2V0LnRpbWUoXCJtb3JwaGRvbVwiLCAoKSA9PiB7XG4gICAgICBtb3JwaGRvbSh0YXJnZXRDb250YWluZXIsIGRpZmZIVE1MLCB7XG4gICAgICAgIGNoaWxkcmVuT25seTogdGFyZ2V0Q29udGFpbmVyLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKSA9PT0gbnVsbCxcbiAgICAgICAgZ2V0Tm9kZUtleTogKG5vZGUpID0+IHtcbiAgICAgICAgICByZXR1cm4gRE9NLmlzUGh4RGVzdHJveWVkKG5vZGUpID8gbnVsbCA6IG5vZGUuaWRcbiAgICAgICAgfSxcbiAgICAgICAgb25CZWZvcmVOb2RlQWRkZWQ6IChlbCkgPT4ge1xuICAgICAgICAgIHRoaXMudHJhY2tCZWZvcmUoXCJhZGRlZFwiLCBlbClcbiAgICAgICAgICByZXR1cm4gZWxcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob2RlQWRkZWQ6IChlbCkgPT4ge1xuICAgICAgICAgIGlmKERPTS5pc05vd1RyaWdnZXJGb3JtRXh0ZXJuYWwoZWwsIHBoeFRyaWdnZXJFeHRlcm5hbCkpe1xuICAgICAgICAgICAgZXh0ZXJuYWxGb3JtVHJpZ2dlcmVkID0gZWxcbiAgICAgICAgICB9XG4gICAgICAgICAgLy9pbnB1dCBoYW5kbGluZ1xuICAgICAgICAgIERPTS5kaXNjYXJkRXJyb3IodGFyZ2V0Q29udGFpbmVyLCBlbCwgcGh4RmVlZGJhY2tGb3IpXG4gICAgICAgICAgLy8gbmVzdGVkIHZpZXcgaGFuZGxpbmdcbiAgICAgICAgICBpZihET00uaXNQaHhDaGlsZChlbCkgJiYgdmlldy5vd25zRWxlbWVudChlbCkpe1xuICAgICAgICAgICAgdGhpcy50cmFja0FmdGVyKFwicGh4Q2hpbGRBZGRlZFwiLCBlbClcbiAgICAgICAgICB9XG4gICAgICAgICAgYWRkZWQucHVzaChlbClcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob2RlRGlzY2FyZGVkOiAoZWwpID0+IHtcbiAgICAgICAgICAvLyBuZXN0ZWQgdmlldyBoYW5kbGluZ1xuICAgICAgICAgIGlmKERPTS5pc1BoeENoaWxkKGVsKSl7IGxpdmVTb2NrZXQuZGVzdHJveVZpZXdCeUVsKGVsKSB9XG4gICAgICAgICAgdGhpcy50cmFja0FmdGVyKFwiZGlzY2FyZGVkXCIsIGVsKVxuICAgICAgICB9LFxuICAgICAgICBvbkJlZm9yZU5vZGVEaXNjYXJkZWQ6IChlbCkgPT4ge1xuICAgICAgICAgIGlmKGVsLmdldEF0dHJpYnV0ZSAmJiBlbC5nZXRBdHRyaWJ1dGUoUEhYX1JFTU9WRSkgIT09IG51bGwpeyByZXR1cm4gdHJ1ZSB9XG4gICAgICAgICAgaWYoZWwucGFyZW50Tm9kZSAhPT0gbnVsbCAmJiBET00uaXNQaHhVcGRhdGUoZWwucGFyZW50Tm9kZSwgcGh4VXBkYXRlLCBbXCJhcHBlbmRcIiwgXCJwcmVwZW5kXCJdKSAmJiBlbC5pZCl7IHJldHVybiBmYWxzZSB9XG4gICAgICAgICAgaWYodGhpcy5za2lwQ0lEU2libGluZyhlbCkpeyByZXR1cm4gZmFsc2UgfVxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIG9uRWxVcGRhdGVkOiAoZWwpID0+IHtcbiAgICAgICAgICBpZihET00uaXNOb3dUcmlnZ2VyRm9ybUV4dGVybmFsKGVsLCBwaHhUcmlnZ2VyRXh0ZXJuYWwpKXtcbiAgICAgICAgICAgIGV4dGVybmFsRm9ybVRyaWdnZXJlZCA9IGVsXG4gICAgICAgICAgfVxuICAgICAgICAgIHVwZGF0ZXMucHVzaChlbClcbiAgICAgICAgfSxcbiAgICAgICAgb25CZWZvcmVFbFVwZGF0ZWQ6IChmcm9tRWwsIHRvRWwpID0+IHtcbiAgICAgICAgICBET00uY2xlYW5DaGlsZE5vZGVzKHRvRWwsIHBoeFVwZGF0ZSlcbiAgICAgICAgICBpZih0aGlzLnNraXBDSURTaWJsaW5nKHRvRWwpKXsgcmV0dXJuIGZhbHNlIH1cbiAgICAgICAgICBpZihET00uaXNJZ25vcmVkKGZyb21FbCwgcGh4VXBkYXRlKSl7XG4gICAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBmcm9tRWwsIHRvRWwpXG4gICAgICAgICAgICBET00ubWVyZ2VBdHRycyhmcm9tRWwsIHRvRWwsIHtpc0lnbm9yZWQ6IHRydWV9KVxuICAgICAgICAgICAgdXBkYXRlcy5wdXNoKGZyb21FbClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZihmcm9tRWwudHlwZSA9PT0gXCJudW1iZXJcIiAmJiAoZnJvbUVsLnZhbGlkaXR5ICYmIGZyb21FbC52YWxpZGl0eS5iYWRJbnB1dCkpeyByZXR1cm4gZmFsc2UgfVxuICAgICAgICAgIGlmKCFET00uc3luY1BlbmRpbmdSZWYoZnJvbUVsLCB0b0VsLCBkaXNhYmxlV2l0aCkpe1xuICAgICAgICAgICAgaWYoRE9NLmlzVXBsb2FkSW5wdXQoZnJvbUVsKSl7XG4gICAgICAgICAgICAgIHRoaXMudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsIGZyb21FbCwgdG9FbClcbiAgICAgICAgICAgICAgdXBkYXRlcy5wdXNoKGZyb21FbClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIG5lc3RlZCB2aWV3IGhhbmRsaW5nXG4gICAgICAgICAgaWYoRE9NLmlzUGh4Q2hpbGQodG9FbCkpe1xuICAgICAgICAgICAgbGV0IHByZXZTZXNzaW9uID0gZnJvbUVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTilcbiAgICAgICAgICAgIERPTS5tZXJnZUF0dHJzKGZyb21FbCwgdG9FbCwge2V4Y2x1ZGU6IFtQSFhfU1RBVElDXX0pXG4gICAgICAgICAgICBpZihwcmV2U2Vzc2lvbiAhPT0gXCJcIil7IGZyb21FbC5zZXRBdHRyaWJ1dGUoUEhYX1NFU1NJT04sIHByZXZTZXNzaW9uKSB9XG4gICAgICAgICAgICBmcm9tRWwuc2V0QXR0cmlidXRlKFBIWF9ST09UX0lELCB0aGlzLnJvb3RJRClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGlucHV0IGhhbmRsaW5nXG4gICAgICAgICAgRE9NLmNvcHlQcml2YXRlcyh0b0VsLCBmcm9tRWwpXG4gICAgICAgICAgRE9NLmRpc2NhcmRFcnJvcih0YXJnZXRDb250YWluZXIsIHRvRWwsIHBoeEZlZWRiYWNrRm9yKVxuICAgICAgICAgIERPTS5zeW5jUHJvcHNUb0F0dHJzKHRvRWwpXG5cbiAgICAgICAgICBsZXQgaXNGb2N1c2VkRm9ybUVsID0gZm9jdXNlZCAmJiBmcm9tRWwuaXNTYW1lTm9kZShmb2N1c2VkKSAmJiBET00uaXNGb3JtSW5wdXQoZnJvbUVsKVxuICAgICAgICAgIGlmKGlzRm9jdXNlZEZvcm1FbCAmJiAhdGhpcy5mb3JjZUZvY3VzZWRTZWxlY3RVcGRhdGUoZnJvbUVsLCB0b0VsKSl7XG4gICAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBmcm9tRWwsIHRvRWwpXG4gICAgICAgICAgICBET00ubWVyZ2VGb2N1c2VkSW5wdXQoZnJvbUVsLCB0b0VsKVxuICAgICAgICAgICAgRE9NLnN5bmNBdHRyc1RvUHJvcHMoZnJvbUVsKVxuICAgICAgICAgICAgdXBkYXRlcy5wdXNoKGZyb21FbClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZihET00uaXNQaHhVcGRhdGUodG9FbCwgcGh4VXBkYXRlLCBbXCJhcHBlbmRcIiwgXCJwcmVwZW5kXCJdKSl7XG4gICAgICAgICAgICAgIGFwcGVuZFByZXBlbmRVcGRhdGVzLnB1c2gobmV3IERPTVBvc3RNb3JwaFJlc3RvcmVyKGZyb21FbCwgdG9FbCwgdG9FbC5nZXRBdHRyaWJ1dGUocGh4VXBkYXRlKSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBET00uc3luY0F0dHJzVG9Qcm9wcyh0b0VsKVxuICAgICAgICAgICAgdGhpcy50cmFja0JlZm9yZShcInVwZGF0ZWRcIiwgZnJvbUVsLCB0b0VsKVxuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGlmKGxpdmVTb2NrZXQuaXNEZWJ1Z0VuYWJsZWQoKSl7IGRldGVjdER1cGxpY2F0ZUlkcygpIH1cblxuICAgIGlmKGFwcGVuZFByZXBlbmRVcGRhdGVzLmxlbmd0aCA+IDApe1xuICAgICAgbGl2ZVNvY2tldC50aW1lKFwicG9zdC1tb3JwaCBhcHBlbmQvcHJlcGVuZCByZXN0b3JhdGlvblwiLCAoKSA9PiB7XG4gICAgICAgIGFwcGVuZFByZXBlbmRVcGRhdGVzLmZvckVhY2godXBkYXRlID0+IHVwZGF0ZS5wZXJmb3JtKCkpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGxpdmVTb2NrZXQuc2lsZW5jZUV2ZW50cygoKSA9PiBET00ucmVzdG9yZUZvY3VzKGZvY3VzZWQsIHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpKVxuICAgIERPTS5kaXNwYXRjaEV2ZW50KGRvY3VtZW50LCBcInBoeDp1cGRhdGVcIilcbiAgICBhZGRlZC5mb3JFYWNoKGVsID0+IHRoaXMudHJhY2tBZnRlcihcImFkZGVkXCIsIGVsKSlcbiAgICB1cGRhdGVzLmZvckVhY2goZWwgPT4gdGhpcy50cmFja0FmdGVyKFwidXBkYXRlZFwiLCBlbCkpXG5cbiAgICBpZihleHRlcm5hbEZvcm1UcmlnZ2VyZWQpe1xuICAgICAgbGl2ZVNvY2tldC5kaXNjb25uZWN0KClcbiAgICAgIGV4dGVybmFsRm9ybVRyaWdnZXJlZC5zdWJtaXQoKVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgZm9yY2VGb2N1c2VkU2VsZWN0VXBkYXRlKGZyb21FbCwgdG9FbCl7XG4gICAgbGV0IGlzU2VsZWN0ID0gW1wic2VsZWN0XCIsIFwic2VsZWN0LW9uZVwiLCBcInNlbGVjdC1tdWx0aXBsZVwiXS5maW5kKCh0KSA9PiB0ID09PSBmcm9tRWwudHlwZSlcbiAgICByZXR1cm4gZnJvbUVsLm11bHRpcGxlID09PSB0cnVlIHx8IChpc1NlbGVjdCAmJiBmcm9tRWwuaW5uZXJIVE1MICE9IHRvRWwuaW5uZXJIVE1MKVxuICB9XG5cbiAgaXNDSURQYXRjaCgpeyByZXR1cm4gdGhpcy5jaWRQYXRjaCB9XG5cbiAgc2tpcENJRFNpYmxpbmcoZWwpe1xuICAgIHJldHVybiBlbC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgZWwuZ2V0QXR0cmlidXRlKFBIWF9TS0lQKSAhPT0gbnVsbFxuICB9XG5cbiAgdGFyZ2V0Q0lEQ29udGFpbmVyKGh0bWwpe1xuICAgIGlmKCF0aGlzLmlzQ0lEUGF0Y2goKSl7IHJldHVybiB9XG4gICAgbGV0IFtmaXJzdCwgLi4ucmVzdF0gPSBET00uZmluZENvbXBvbmVudE5vZGVMaXN0KHRoaXMuY29udGFpbmVyLCB0aGlzLnRhcmdldENJRClcbiAgICBpZihyZXN0Lmxlbmd0aCA9PT0gMCAmJiBET00uY2hpbGROb2RlTGVuZ3RoKGh0bWwpID09PSAxKXtcbiAgICAgIHJldHVybiBmaXJzdFxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmlyc3QgJiYgZmlyc3QucGFyZW50Tm9kZVxuICAgIH1cbiAgfVxuXG4gIC8vIGJ1aWxkcyBIVE1MIGZvciBtb3JwaGRvbSBwYXRjaFxuICAvLyAtIGZvciBmdWxsIHBhdGNoZXMgb2YgTGl2ZVZpZXcgb3IgYSBjb21wb25lbnQgd2l0aCBhIHNpbmdsZVxuICAvLyAgIHJvb3Qgbm9kZSwgc2ltcGx5IHJldHVybnMgdGhlIEhUTUxcbiAgLy8gLSBmb3IgcGF0Y2hlcyBvZiBhIGNvbXBvbmVudCB3aXRoIG11bHRpcGxlIHJvb3Qgbm9kZXMsIHRoZVxuICAvLyAgIHBhcmVudCBub2RlIGJlY29tZXMgdGhlIHRhcmdldCBjb250YWluZXIgYW5kIG5vbi1jb21wb25lbnRcbiAgLy8gICBzaWJsaW5ncyBhcmUgbWFya2VkIGFzIHNraXAuXG4gIGJ1aWxkRGlmZkhUTUwoY29udGFpbmVyLCBodG1sLCBwaHhVcGRhdGUsIHRhcmdldENvbnRhaW5lcil7XG4gICAgbGV0IGlzQ0lEUGF0Y2ggPSB0aGlzLmlzQ0lEUGF0Y2goKVxuICAgIGxldCBpc0NJRFdpdGhTaW5nbGVSb290ID0gaXNDSURQYXRjaCAmJiB0YXJnZXRDb250YWluZXIuZ2V0QXR0cmlidXRlKFBIWF9DT01QT05FTlQpID09PSB0aGlzLnRhcmdldENJRC50b1N0cmluZygpXG4gICAgaWYoIWlzQ0lEUGF0Y2ggfHwgaXNDSURXaXRoU2luZ2xlUm9vdCl7XG4gICAgICByZXR1cm4gaHRtbFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb21wb25lbnQgcGF0Y2ggd2l0aCBtdWx0aXBsZSBDSUQgcm9vdHNcbiAgICAgIGxldCBkaWZmQ29udGFpbmVyID0gbnVsbFxuICAgICAgbGV0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpXG4gICAgICBkaWZmQ29udGFpbmVyID0gRE9NLmNsb25lTm9kZSh0YXJnZXRDb250YWluZXIpXG4gICAgICBsZXQgW2ZpcnN0Q29tcG9uZW50LCAuLi5yZXN0XSA9IERPTS5maW5kQ29tcG9uZW50Tm9kZUxpc3QoZGlmZkNvbnRhaW5lciwgdGhpcy50YXJnZXRDSUQpXG4gICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sXG4gICAgICByZXN0LmZvckVhY2goZWwgPT4gZWwucmVtb3ZlKCkpXG4gICAgICBBcnJheS5mcm9tKGRpZmZDb250YWluZXIuY2hpbGROb2RlcykuZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgIC8vIHdlIGNhbiBvbmx5IHNraXAgdHJhY2thYmxlIG5vZGVzIHdpdGggYW4gSURcbiAgICAgICAgaWYoY2hpbGQuaWQgJiYgY2hpbGQubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFICYmIGNoaWxkLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKSAhPT0gdGhpcy50YXJnZXRDSUQudG9TdHJpbmcoKSl7XG4gICAgICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKFBIWF9TS0lQLCBcIlwiKVxuICAgICAgICAgIGNoaWxkLmlubmVySFRNTCA9IFwiXCJcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIEFycmF5LmZyb20odGVtcGxhdGUuY29udGVudC5jaGlsZE5vZGVzKS5mb3JFYWNoKGVsID0+IGRpZmZDb250YWluZXIuaW5zZXJ0QmVmb3JlKGVsLCBmaXJzdENvbXBvbmVudCkpXG4gICAgICBmaXJzdENvbXBvbmVudC5yZW1vdmUoKVxuICAgICAgcmV0dXJuIGRpZmZDb250YWluZXIub3V0ZXJIVE1MXG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgQ09NUE9ORU5UUyxcbiAgRFlOQU1JQ1MsXG4gIEVWRU5UUyxcbiAgUEhYX0NPTVBPTkVOVCxcbiAgUEhYX1NLSVAsXG4gIFJFUExZLFxuICBTVEFUSUMsXG4gIFRJVExFXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBsb2dFcnJvclxufSBmcm9tIFwiLi91dGlsc1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlbmRlcmVkIHtcbiAgc3RhdGljIGV4dHJhY3QoZGlmZil7XG4gICAgbGV0IHtbUkVQTFldOiByZXBseSwgW0VWRU5UU106IGV2ZW50cywgW1RJVExFXTogdGl0bGV9ID0gZGlmZlxuICAgIGRlbGV0ZSBkaWZmW1JFUExZXVxuICAgIGRlbGV0ZSBkaWZmW0VWRU5UU11cbiAgICBkZWxldGUgZGlmZltUSVRMRV1cbiAgICByZXR1cm4ge2RpZmYsIHRpdGxlLCByZXBseTogcmVwbHkgfHwgbnVsbCwgZXZlbnRzOiBldmVudHMgfHwgW119XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih2aWV3SWQsIHJlbmRlcmVkKXtcbiAgICB0aGlzLnZpZXdJZCA9IHZpZXdJZFxuICAgIHRoaXMucmVuZGVyZWQgPSB7fVxuICAgIHRoaXMubWVyZ2VEaWZmKHJlbmRlcmVkKVxuICB9XG5cbiAgcGFyZW50Vmlld0lkKCl7IHJldHVybiB0aGlzLnZpZXdJZCB9XG5cbiAgdG9TdHJpbmcob25seUNpZHMpe1xuICAgIHJldHVybiB0aGlzLnJlY3Vyc2l2ZVRvU3RyaW5nKHRoaXMucmVuZGVyZWQsIHRoaXMucmVuZGVyZWRbQ09NUE9ORU5UU10sIG9ubHlDaWRzKVxuICB9XG5cbiAgcmVjdXJzaXZlVG9TdHJpbmcocmVuZGVyZWQsIGNvbXBvbmVudHMgPSByZW5kZXJlZFtDT01QT05FTlRTXSwgb25seUNpZHMpe1xuICAgIG9ubHlDaWRzID0gb25seUNpZHMgPyBuZXcgU2V0KG9ubHlDaWRzKSA6IG51bGxcbiAgICBsZXQgb3V0cHV0ID0ge2J1ZmZlcjogXCJcIiwgY29tcG9uZW50czogY29tcG9uZW50cywgb25seUNpZHM6IG9ubHlDaWRzfVxuICAgIHRoaXMudG9PdXRwdXRCdWZmZXIocmVuZGVyZWQsIG91dHB1dClcbiAgICByZXR1cm4gb3V0cHV0LmJ1ZmZlclxuICB9XG5cbiAgY29tcG9uZW50Q0lEcyhkaWZmKXsgcmV0dXJuIE9iamVjdC5rZXlzKGRpZmZbQ09NUE9ORU5UU10gfHwge30pLm1hcChpID0+IHBhcnNlSW50KGkpKSB9XG5cbiAgaXNDb21wb25lbnRPbmx5RGlmZihkaWZmKXtcbiAgICBpZighZGlmZltDT01QT05FTlRTXSl7IHJldHVybiBmYWxzZSB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGRpZmYpLmxlbmd0aCA9PT0gMVxuICB9XG5cbiAgZ2V0Q29tcG9uZW50KGRpZmYsIGNpZCl7IHJldHVybiBkaWZmW0NPTVBPTkVOVFNdW2NpZF0gfVxuXG4gIG1lcmdlRGlmZihkaWZmKXtcbiAgICBsZXQgbmV3YyA9IGRpZmZbQ09NUE9ORU5UU11cbiAgICBsZXQgY2FjaGUgPSB7fVxuICAgIGRlbGV0ZSBkaWZmW0NPTVBPTkVOVFNdXG4gICAgdGhpcy5yZW5kZXJlZCA9IHRoaXMubXV0YWJsZU1lcmdlKHRoaXMucmVuZGVyZWQsIGRpZmYpXG4gICAgdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXSA9IHRoaXMucmVuZGVyZWRbQ09NUE9ORU5UU10gfHwge31cblxuICAgIGlmKG5ld2Mpe1xuICAgICAgbGV0IG9sZGMgPSB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdXG5cbiAgICAgIGZvcihsZXQgY2lkIGluIG5ld2Mpe1xuICAgICAgICBuZXdjW2NpZF0gPSB0aGlzLmNhY2hlZEZpbmRDb21wb25lbnQoY2lkLCBuZXdjW2NpZF0sIG9sZGMsIG5ld2MsIGNhY2hlKVxuICAgICAgfVxuXG4gICAgICBmb3IodmFyIGtleSBpbiBuZXdjKXsgb2xkY1trZXldID0gbmV3Y1trZXldIH1cbiAgICAgIGRpZmZbQ09NUE9ORU5UU10gPSBuZXdjXG4gICAgfVxuICB9XG5cbiAgY2FjaGVkRmluZENvbXBvbmVudChjaWQsIGNkaWZmLCBvbGRjLCBuZXdjLCBjYWNoZSl7XG4gICAgaWYoY2FjaGVbY2lkXSl7XG4gICAgICByZXR1cm4gY2FjaGVbY2lkXVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbmRpZmYsIHN0YXQsIHNjaWQgPSBjZGlmZltTVEFUSUNdXG5cbiAgICAgIGlmKHR5cGVvZiAoc2NpZCkgPT09IFwibnVtYmVyXCIpe1xuICAgICAgICBsZXQgdGRpZmZcblxuICAgICAgICBpZihzY2lkID4gMCl7XG4gICAgICAgICAgdGRpZmYgPSB0aGlzLmNhY2hlZEZpbmRDb21wb25lbnQoc2NpZCwgbmV3Y1tzY2lkXSwgb2xkYywgbmV3YywgY2FjaGUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGRpZmYgPSBvbGRjWy1zY2lkXVxuICAgICAgICB9XG5cbiAgICAgICAgc3RhdCA9IHRkaWZmW1NUQVRJQ11cbiAgICAgICAgbmRpZmYgPSB0aGlzLmNsb25lTWVyZ2UodGRpZmYsIGNkaWZmKVxuICAgICAgICBuZGlmZltTVEFUSUNdID0gc3RhdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmRpZmYgPSBjZGlmZltTVEFUSUNdICE9PSB1bmRlZmluZWQgPyBjZGlmZiA6IHRoaXMuY2xvbmVNZXJnZShvbGRjW2NpZF0gfHwge30sIGNkaWZmKVxuICAgICAgfVxuXG4gICAgICBjYWNoZVtjaWRdID0gbmRpZmZcbiAgICAgIHJldHVybiBuZGlmZlxuICAgIH1cbiAgfVxuXG4gIG11dGFibGVNZXJnZSh0YXJnZXQsIHNvdXJjZSl7XG4gICAgaWYoc291cmNlW1NUQVRJQ10gIT09IHVuZGVmaW5lZCl7XG4gICAgICByZXR1cm4gc291cmNlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZG9NdXRhYmxlTWVyZ2UodGFyZ2V0LCBzb3VyY2UpXG4gICAgICByZXR1cm4gdGFyZ2V0XG4gICAgfVxuICB9XG5cbiAgZG9NdXRhYmxlTWVyZ2UodGFyZ2V0LCBzb3VyY2Upe1xuICAgIGZvcihsZXQga2V5IGluIHNvdXJjZSl7XG4gICAgICBsZXQgdmFsID0gc291cmNlW2tleV1cbiAgICAgIGxldCB0YXJnZXRWYWwgPSB0YXJnZXRba2V5XVxuICAgICAgaWYoaXNPYmplY3QodmFsKSAmJiB2YWxbU1RBVElDXSA9PT0gdW5kZWZpbmVkICYmIGlzT2JqZWN0KHRhcmdldFZhbCkpe1xuICAgICAgICB0aGlzLmRvTXV0YWJsZU1lcmdlKHRhcmdldFZhbCwgdmFsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjbG9uZU1lcmdlKHRhcmdldCwgc291cmNlKXtcbiAgICBsZXQgbWVyZ2VkID0gey4uLnRhcmdldCwgLi4uc291cmNlfVxuICAgIGZvcihsZXQga2V5IGluIG1lcmdlZCl7XG4gICAgICBsZXQgdmFsID0gc291cmNlW2tleV1cbiAgICAgIGxldCB0YXJnZXRWYWwgPSB0YXJnZXRba2V5XVxuICAgICAgaWYoaXNPYmplY3QodmFsKSAmJiB2YWxbU1RBVElDXSA9PT0gdW5kZWZpbmVkICYmIGlzT2JqZWN0KHRhcmdldFZhbCkpe1xuICAgICAgICBtZXJnZWRba2V5XSA9IHRoaXMuY2xvbmVNZXJnZSh0YXJnZXRWYWwsIHZhbClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZFxuICB9XG5cbiAgY29tcG9uZW50VG9TdHJpbmcoY2lkKXsgcmV0dXJuIHRoaXMucmVjdXJzaXZlQ0lEVG9TdHJpbmcodGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXSwgY2lkKSB9XG5cbiAgcHJ1bmVDSURzKGNpZHMpe1xuICAgIGNpZHMuZm9yRWFjaChjaWQgPT4gZGVsZXRlIHRoaXMucmVuZGVyZWRbQ09NUE9ORU5UU11bY2lkXSlcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICBnZXQoKXsgcmV0dXJuIHRoaXMucmVuZGVyZWQgfVxuXG4gIGlzTmV3RmluZ2VycHJpbnQoZGlmZiA9IHt9KXsgcmV0dXJuICEhZGlmZltTVEFUSUNdIH1cblxuICB0b091dHB1dEJ1ZmZlcihyZW5kZXJlZCwgb3V0cHV0KXtcbiAgICBpZihyZW5kZXJlZFtEWU5BTUlDU10peyByZXR1cm4gdGhpcy5jb21wcmVoZW5zaW9uVG9CdWZmZXIocmVuZGVyZWQsIG91dHB1dCkgfVxuICAgIGxldCB7W1NUQVRJQ106IHN0YXRpY3N9ID0gcmVuZGVyZWRcblxuICAgIG91dHB1dC5idWZmZXIgKz0gc3RhdGljc1swXVxuICAgIGZvcihsZXQgaSA9IDE7IGkgPCBzdGF0aWNzLmxlbmd0aDsgaSsrKXtcbiAgICAgIHRoaXMuZHluYW1pY1RvQnVmZmVyKHJlbmRlcmVkW2kgLSAxXSwgb3V0cHV0KVxuICAgICAgb3V0cHV0LmJ1ZmZlciArPSBzdGF0aWNzW2ldXG4gICAgfVxuICB9XG5cbiAgY29tcHJlaGVuc2lvblRvQnVmZmVyKHJlbmRlcmVkLCBvdXRwdXQpe1xuICAgIGxldCB7W0RZTkFNSUNTXTogZHluYW1pY3MsIFtTVEFUSUNdOiBzdGF0aWNzfSA9IHJlbmRlcmVkXG5cbiAgICBmb3IobGV0IGQgPSAwOyBkIDwgZHluYW1pY3MubGVuZ3RoOyBkKyspe1xuICAgICAgbGV0IGR5bmFtaWMgPSBkeW5hbWljc1tkXVxuICAgICAgb3V0cHV0LmJ1ZmZlciArPSBzdGF0aWNzWzBdXG4gICAgICBmb3IobGV0IGkgPSAxOyBpIDwgc3RhdGljcy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIHRoaXMuZHluYW1pY1RvQnVmZmVyKGR5bmFtaWNbaSAtIDFdLCBvdXRwdXQpXG4gICAgICAgIG91dHB1dC5idWZmZXIgKz0gc3RhdGljc1tpXVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGR5bmFtaWNUb0J1ZmZlcihyZW5kZXJlZCwgb3V0cHV0KXtcbiAgICBpZih0eXBlb2YgKHJlbmRlcmVkKSA9PT0gXCJudW1iZXJcIil7XG4gICAgICBvdXRwdXQuYnVmZmVyICs9IHRoaXMucmVjdXJzaXZlQ0lEVG9TdHJpbmcob3V0cHV0LmNvbXBvbmVudHMsIHJlbmRlcmVkLCBvdXRwdXQub25seUNpZHMpXG4gICAgfSBlbHNlIGlmKGlzT2JqZWN0KHJlbmRlcmVkKSl7XG4gICAgICB0aGlzLnRvT3V0cHV0QnVmZmVyKHJlbmRlcmVkLCBvdXRwdXQpXG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5idWZmZXIgKz0gcmVuZGVyZWRcbiAgICB9XG4gIH1cblxuICByZWN1cnNpdmVDSURUb1N0cmluZyhjb21wb25lbnRzLCBjaWQsIG9ubHlDaWRzKXtcbiAgICBsZXQgY29tcG9uZW50ID0gY29tcG9uZW50c1tjaWRdIHx8IGxvZ0Vycm9yKGBubyBjb21wb25lbnQgZm9yIENJRCAke2NpZH1gLCBjb21wb25lbnRzKVxuICAgIGxldCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKVxuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IHRoaXMucmVjdXJzaXZlVG9TdHJpbmcoY29tcG9uZW50LCBjb21wb25lbnRzLCBvbmx5Q2lkcylcbiAgICBsZXQgY29udGFpbmVyID0gdGVtcGxhdGUuY29udGVudFxuICAgIGxldCBza2lwID0gb25seUNpZHMgJiYgIW9ubHlDaWRzLmhhcyhjaWQpXG5cbiAgICBsZXQgW2hhc0NoaWxkTm9kZXMsIGhhc0NoaWxkQ29tcG9uZW50c10gPVxuICAgICAgQXJyYXkuZnJvbShjb250YWluZXIuY2hpbGROb2RlcykucmVkdWNlKChbaGFzTm9kZXMsIGhhc0NvbXBvbmVudHNdLCBjaGlsZCwgaSkgPT4ge1xuICAgICAgICBpZihjaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpe1xuICAgICAgICAgIGlmKGNoaWxkLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKSl7XG4gICAgICAgICAgICByZXR1cm4gW2hhc05vZGVzLCB0cnVlXVxuICAgICAgICAgIH1cbiAgICAgICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoUEhYX0NPTVBPTkVOVCwgY2lkKVxuICAgICAgICAgIGlmKCFjaGlsZC5pZCl7IGNoaWxkLmlkID0gYCR7dGhpcy5wYXJlbnRWaWV3SWQoKX0tJHtjaWR9LSR7aX1gIH1cbiAgICAgICAgICBpZihza2lwKXtcbiAgICAgICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZShQSFhfU0tJUCwgXCJcIilcbiAgICAgICAgICAgIGNoaWxkLmlubmVySFRNTCA9IFwiXCJcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFt0cnVlLCBoYXNDb21wb25lbnRzXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmKGNoaWxkLm5vZGVWYWx1ZS50cmltKCkgIT09IFwiXCIpe1xuICAgICAgICAgICAgbG9nRXJyb3IoXCJvbmx5IEhUTUwgZWxlbWVudCB0YWdzIGFyZSBhbGxvd2VkIGF0IHRoZSByb290IG9mIGNvbXBvbmVudHMuXFxuXFxuXCIgK1xuICAgICAgICAgICAgICBgZ290OiBcIiR7Y2hpbGQubm9kZVZhbHVlLnRyaW0oKX1cIlxcblxcbmAgK1xuICAgICAgICAgICAgICBcIndpdGhpbjpcXG5cIiwgdGVtcGxhdGUuaW5uZXJIVE1MLnRyaW0oKSlcbiAgICAgICAgICAgIGNoaWxkLnJlcGxhY2VXaXRoKHRoaXMuY3JlYXRlU3BhbihjaGlsZC5ub2RlVmFsdWUsIGNpZCkpXG4gICAgICAgICAgICByZXR1cm4gW3RydWUsIGhhc0NvbXBvbmVudHNdXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNoaWxkLnJlbW92ZSgpXG4gICAgICAgICAgICByZXR1cm4gW2hhc05vZGVzLCBoYXNDb21wb25lbnRzXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgW2ZhbHNlLCBmYWxzZV0pXG5cbiAgICBpZighaGFzQ2hpbGROb2RlcyAmJiAhaGFzQ2hpbGRDb21wb25lbnRzKXtcbiAgICAgIGxvZ0Vycm9yKFwiZXhwZWN0ZWQgYXQgbGVhc3Qgb25lIEhUTUwgZWxlbWVudCB0YWcgaW5zaWRlIGEgY29tcG9uZW50LCBidXQgdGhlIGNvbXBvbmVudCBpcyBlbXB0eTpcXG5cIixcbiAgICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MLnRyaW0oKSlcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNwYW4oXCJcIiwgY2lkKS5vdXRlckhUTUxcbiAgICB9IGVsc2UgaWYoIWhhc0NoaWxkTm9kZXMgJiYgaGFzQ2hpbGRDb21wb25lbnRzKXtcbiAgICAgIGxvZ0Vycm9yKFwiZXhwZWN0ZWQgYXQgbGVhc3Qgb25lIEhUTUwgZWxlbWVudCB0YWcgZGlyZWN0bHkgaW5zaWRlIGEgY29tcG9uZW50LCBidXQgb25seSBzdWJjb21wb25lbnRzIHdlcmUgZm91bmQuIEEgY29tcG9uZW50IG11c3QgcmVuZGVyIGF0IGxlYXN0IG9uZSBIVE1MIHRhZyBkaXJlY3RseSBpbnNpZGUgaXRzZWxmLlwiLFxuICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwudHJpbSgpKVxuICAgICAgcmV0dXJuIHRlbXBsYXRlLmlubmVySFRNTFxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGVtcGxhdGUuaW5uZXJIVE1MXG4gICAgfVxuICB9XG5cbiAgY3JlYXRlU3Bhbih0ZXh0LCBjaWQpe1xuICAgIGxldCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIilcbiAgICBzcGFuLmlubmVyVGV4dCA9IHRleHRcbiAgICBzcGFuLnNldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5ULCBjaWQpXG4gICAgcmV0dXJuIHNwYW5cbiAgfVxufVxuIiwgImxldCB2aWV3SG9va0lEID0gMVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlld0hvb2sge1xuICBzdGF0aWMgbWFrZUlEKCl7IHJldHVybiB2aWV3SG9va0lEKysgfVxuICBzdGF0aWMgZWxlbWVudElEKGVsKXsgcmV0dXJuIGVsLnBoeEhvb2tJZCB9XG5cbiAgY29uc3RydWN0b3IodmlldywgZWwsIGNhbGxiYWNrcyl7XG4gICAgdGhpcy5fX3ZpZXcgPSB2aWV3XG4gICAgdGhpcy5fX2xpdmVTb2NrZXQgPSB2aWV3LmxpdmVTb2NrZXRcbiAgICB0aGlzLl9fY2FsbGJhY2tzID0gY2FsbGJhY2tzXG4gICAgdGhpcy5fX2xpc3RlbmVycyA9IG5ldyBTZXQoKVxuICAgIHRoaXMuX19pc0Rpc2Nvbm5lY3RlZCA9IGZhbHNlXG4gICAgdGhpcy5lbCA9IGVsXG4gICAgdGhpcy5lbC5waHhIb29rSWQgPSB0aGlzLmNvbnN0cnVjdG9yLm1ha2VJRCgpXG4gICAgZm9yKGxldCBrZXkgaW4gdGhpcy5fX2NhbGxiYWNrcyl7IHRoaXNba2V5XSA9IHRoaXMuX19jYWxsYmFja3Nba2V5XSB9XG4gIH1cblxuICBfX21vdW50ZWQoKXsgdGhpcy5tb3VudGVkICYmIHRoaXMubW91bnRlZCgpIH1cbiAgX191cGRhdGVkKCl7IHRoaXMudXBkYXRlZCAmJiB0aGlzLnVwZGF0ZWQoKSB9XG4gIF9fYmVmb3JlVXBkYXRlKCl7IHRoaXMuYmVmb3JlVXBkYXRlICYmIHRoaXMuYmVmb3JlVXBkYXRlKCkgfVxuICBfX2Rlc3Ryb3llZCgpeyB0aGlzLmRlc3Ryb3llZCAmJiB0aGlzLmRlc3Ryb3llZCgpIH1cbiAgX19yZWNvbm5lY3RlZCgpe1xuICAgIGlmKHRoaXMuX19pc0Rpc2Nvbm5lY3RlZCl7XG4gICAgICB0aGlzLl9faXNEaXNjb25uZWN0ZWQgPSBmYWxzZVxuICAgICAgdGhpcy5yZWNvbm5lY3RlZCAmJiB0aGlzLnJlY29ubmVjdGVkKClcbiAgICB9XG4gIH1cbiAgX19kaXNjb25uZWN0ZWQoKXtcbiAgICB0aGlzLl9faXNEaXNjb25uZWN0ZWQgPSB0cnVlXG4gICAgdGhpcy5kaXNjb25uZWN0ZWQgJiYgdGhpcy5kaXNjb25uZWN0ZWQoKVxuICB9XG5cbiAgcHVzaEV2ZW50KGV2ZW50LCBwYXlsb2FkID0ge30sIG9uUmVwbHkgPSBmdW5jdGlvbiAoKXsgfSl7XG4gICAgcmV0dXJuIHRoaXMuX192aWV3LnB1c2hIb29rRXZlbnQobnVsbCwgZXZlbnQsIHBheWxvYWQsIG9uUmVwbHkpXG4gIH1cblxuICBwdXNoRXZlbnRUbyhwaHhUYXJnZXQsIGV2ZW50LCBwYXlsb2FkID0ge30sIG9uUmVwbHkgPSBmdW5jdGlvbiAoKXsgfSl7XG4gICAgcmV0dXJuIHRoaXMuX192aWV3LndpdGhpblRhcmdldHMocGh4VGFyZ2V0LCAodmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICByZXR1cm4gdmlldy5wdXNoSG9va0V2ZW50KHRhcmdldEN0eCwgZXZlbnQsIHBheWxvYWQsIG9uUmVwbHkpXG4gICAgfSlcbiAgfVxuXG4gIGhhbmRsZUV2ZW50KGV2ZW50LCBjYWxsYmFjayl7XG4gICAgbGV0IGNhbGxiYWNrUmVmID0gKGN1c3RvbUV2ZW50LCBieXBhc3MpID0+IGJ5cGFzcyA/IGV2ZW50IDogY2FsbGJhY2soY3VzdG9tRXZlbnQuZGV0YWlsKVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGBwaHg6aG9vazoke2V2ZW50fWAsIGNhbGxiYWNrUmVmKVxuICAgIHRoaXMuX19saXN0ZW5lcnMuYWRkKGNhbGxiYWNrUmVmKVxuICAgIHJldHVybiBjYWxsYmFja1JlZlxuICB9XG5cbiAgcmVtb3ZlSGFuZGxlRXZlbnQoY2FsbGJhY2tSZWYpe1xuICAgIGxldCBldmVudCA9IGNhbGxiYWNrUmVmKG51bGwsIHRydWUpXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoYHBoeDpob29rOiR7ZXZlbnR9YCwgY2FsbGJhY2tSZWYpXG4gICAgdGhpcy5fX2xpc3RlbmVycy5kZWxldGUoY2FsbGJhY2tSZWYpXG4gIH1cblxuICB1cGxvYWQobmFtZSwgZmlsZXMpe1xuICAgIHJldHVybiB0aGlzLl9fdmlldy5kaXNwYXRjaFVwbG9hZHMobmFtZSwgZmlsZXMpXG4gIH1cblxuICB1cGxvYWRUbyhwaHhUYXJnZXQsIG5hbWUsIGZpbGVzKXtcbiAgICByZXR1cm4gdGhpcy5fX3ZpZXcud2l0aGluVGFyZ2V0cyhwaHhUYXJnZXQsIHZpZXcgPT4gdmlldy5kaXNwYXRjaFVwbG9hZHMobmFtZSwgZmlsZXMpKVxuICB9XG5cbiAgX19jbGVhbnVwX18oKXtcbiAgICB0aGlzLl9fbGlzdGVuZXJzLmZvckVhY2goY2FsbGJhY2tSZWYgPT4gdGhpcy5yZW1vdmVIYW5kbGVFdmVudChjYWxsYmFja1JlZikpXG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBCRUZPUkVfVU5MT0FEX0xPQURFUl9USU1FT1VULFxuICBDSEVDS0FCTEVfSU5QVVRTLFxuICBDT05TRUNVVElWRV9SRUxPQURTLFxuICBQSFhfQVVUT19SRUNPVkVSLFxuICBQSFhfQ09NUE9ORU5ULFxuICBQSFhfQ09OTkVDVEVEX0NMQVNTLFxuICBQSFhfRElTQUJMRV9XSVRILFxuICBQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUsXG4gIFBIWF9ESVNBQkxFRCxcbiAgUEhYX0RJU0NPTk5FQ1RFRF9DTEFTUyxcbiAgUEhYX0VWRU5UX0NMQVNTRVMsXG4gIFBIWF9FUlJPUl9DTEFTUyxcbiAgUEhYX0ZFRURCQUNLX0ZPUixcbiAgUEhYX0hBU19TVUJNSVRURUQsXG4gIFBIWF9IT09LLFxuICBQSFhfUEFHRV9MT0FESU5HLFxuICBQSFhfUEFSRU5UX0lELFxuICBQSFhfUFJPR1JFU1MsXG4gIFBIWF9SRUFET05MWSxcbiAgUEhYX1JFRixcbiAgUEhYX1JPT1RfSUQsXG4gIFBIWF9TRVNTSU9OLFxuICBQSFhfU1RBVElDLFxuICBQSFhfVFJBQ0tfU1RBVElDLFxuICBQSFhfVFJBQ0tfVVBMT0FEUyxcbiAgUEhYX1VQREFURSxcbiAgUEhYX1VQTE9BRF9SRUYsXG4gIFBIWF9WSUVXX1NFTEVDVE9SLFxuICBQVVNIX1RJTUVPVVQsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCB7XG4gIGNsb25lLFxuICBjbG9zZXN0UGh4QmluZGluZyxcbiAgaXNFbXB0eSxcbiAgaXNFcXVhbE9iaixcbiAgbG9nRXJyb3IsXG4gIG1heWJlXG59IGZyb20gXCIuL3V0aWxzXCJcblxuaW1wb3J0IEJyb3dzZXIgZnJvbSBcIi4vYnJvd3NlclwiXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbVwiXG5pbXBvcnQgRE9NUGF0Y2ggZnJvbSBcIi4vZG9tX3BhdGNoXCJcbmltcG9ydCBMaXZlVXBsb2FkZXIgZnJvbSBcIi4vbGl2ZV91cGxvYWRlclwiXG5pbXBvcnQgUmVuZGVyZWQgZnJvbSBcIi4vcmVuZGVyZWRcIlxuaW1wb3J0IFZpZXdIb29rIGZyb20gXCIuL3ZpZXdfaG9va1wiXG5cbmxldCBzZXJpYWxpemVGb3JtID0gKGZvcm0sIG1ldGEgPSB7fSkgPT4ge1xuICBsZXQgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZm9ybSlcbiAgbGV0IHRvUmVtb3ZlID0gW11cblxuICBmb3JtRGF0YS5mb3JFYWNoKCh2YWwsIGtleSwgX2luZGV4KSA9PiB7XG4gICAgaWYodmFsIGluc3RhbmNlb2YgRmlsZSl7IHRvUmVtb3ZlLnB1c2goa2V5KSB9XG4gIH0pXG5cbiAgLy8gQ2xlYW51cCBhZnRlciBidWlsZGluZyBmaWxlRGF0YVxuICB0b1JlbW92ZS5mb3JFYWNoKGtleSA9PiBmb3JtRGF0YS5kZWxldGUoa2V5KSlcblxuICBsZXQgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpXG4gIGZvcihsZXQgW2tleSwgdmFsXSBvZiBmb3JtRGF0YS5lbnRyaWVzKCkpeyBwYXJhbXMuYXBwZW5kKGtleSwgdmFsKSB9XG4gIGZvcihsZXQgbWV0YUtleSBpbiBtZXRhKXsgcGFyYW1zLmFwcGVuZChtZXRhS2V5LCBtZXRhW21ldGFLZXldKSB9XG5cbiAgcmV0dXJuIHBhcmFtcy50b1N0cmluZygpXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpZXcge1xuICBjb25zdHJ1Y3RvcihlbCwgbGl2ZVNvY2tldCwgcGFyZW50VmlldywgZmxhc2gpe1xuICAgIHRoaXMubGl2ZVNvY2tldCA9IGxpdmVTb2NrZXRcbiAgICB0aGlzLmZsYXNoID0gZmxhc2hcbiAgICB0aGlzLnBhcmVudCA9IHBhcmVudFZpZXdcbiAgICB0aGlzLnJvb3QgPSBwYXJlbnRWaWV3ID8gcGFyZW50Vmlldy5yb290IDogdGhpc1xuICAgIHRoaXMuZWwgPSBlbFxuICAgIHRoaXMuaWQgPSB0aGlzLmVsLmlkXG4gICAgdGhpcy5yZWYgPSAwXG4gICAgdGhpcy5jaGlsZEpvaW5zID0gMFxuICAgIHRoaXMubG9hZGVyVGltZXIgPSBudWxsXG4gICAgdGhpcy5wZW5kaW5nRGlmZnMgPSBbXVxuICAgIHRoaXMucHJ1bmluZ0NJRHMgPSBbXVxuICAgIHRoaXMucmVkaXJlY3QgPSBmYWxzZVxuICAgIHRoaXMuaHJlZiA9IG51bGxcbiAgICB0aGlzLmpvaW5Db3VudCA9IHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQuam9pbkNvdW50IC0gMSA6IDBcbiAgICB0aGlzLmpvaW5QZW5kaW5nID0gdHJ1ZVxuICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2VcbiAgICB0aGlzLmpvaW5DYWxsYmFjayA9IGZ1bmN0aW9uICgpeyB9XG4gICAgdGhpcy5zdG9wQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKXsgfVxuICAgIHRoaXMucGVuZGluZ0pvaW5PcHMgPSB0aGlzLnBhcmVudCA/IG51bGwgOiBbXVxuICAgIHRoaXMudmlld0hvb2tzID0ge31cbiAgICB0aGlzLnVwbG9hZGVycyA9IHt9XG4gICAgdGhpcy5mb3JtU3VibWl0cyA9IFtdXG4gICAgdGhpcy5jaGlsZHJlbiA9IHRoaXMucGFyZW50ID8gbnVsbCA6IHt9XG4gICAgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdID0ge31cbiAgICB0aGlzLmNoYW5uZWwgPSB0aGlzLmxpdmVTb2NrZXQuY2hhbm5lbChgbHY6JHt0aGlzLmlkfWAsICgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZGlyZWN0OiB0aGlzLnJlZGlyZWN0ID8gdGhpcy5ocmVmIDogdW5kZWZpbmVkLFxuICAgICAgICB1cmw6IHRoaXMucmVkaXJlY3QgPyB1bmRlZmluZWQgOiB0aGlzLmhyZWYgfHwgdW5kZWZpbmVkLFxuICAgICAgICBwYXJhbXM6IHRoaXMuY29ubmVjdFBhcmFtcygpLFxuICAgICAgICBzZXNzaW9uOiB0aGlzLmdldFNlc3Npb24oKSxcbiAgICAgICAgc3RhdGljOiB0aGlzLmdldFN0YXRpYygpLFxuICAgICAgICBmbGFzaDogdGhpcy5mbGFzaFxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5zaG93TG9hZGVyKHRoaXMubGl2ZVNvY2tldC5sb2FkZXJUaW1lb3V0KVxuICAgIHRoaXMuYmluZENoYW5uZWwoKVxuICB9XG5cbiAgc2V0SHJlZihocmVmKXsgdGhpcy5ocmVmID0gaHJlZiB9XG5cbiAgc2V0UmVkaXJlY3QoaHJlZil7XG4gICAgdGhpcy5yZWRpcmVjdCA9IHRydWVcbiAgICB0aGlzLmhyZWYgPSBocmVmXG4gIH1cblxuICBpc01haW4oKXsgcmV0dXJuIHRoaXMubGl2ZVNvY2tldC5tYWluID09PSB0aGlzIH1cblxuICBjb25uZWN0UGFyYW1zKCl7XG4gICAgbGV0IHBhcmFtcyA9IHRoaXMubGl2ZVNvY2tldC5wYXJhbXModGhpcy5lbClcbiAgICBsZXQgbWFuaWZlc3QgPVxuICAgICAgRE9NLmFsbChkb2N1bWVudCwgYFske3RoaXMuYmluZGluZyhQSFhfVFJBQ0tfU1RBVElDKX1dYClcbiAgICAgICAgLm1hcChub2RlID0+IG5vZGUuc3JjIHx8IG5vZGUuaHJlZikuZmlsdGVyKHVybCA9PiB0eXBlb2YgKHVybCkgPT09IFwic3RyaW5nXCIpXG5cbiAgICBpZihtYW5pZmVzdC5sZW5ndGggPiAwKXsgcGFyYW1zW1wiX3RyYWNrX3N0YXRpY1wiXSA9IG1hbmlmZXN0IH1cbiAgICBwYXJhbXNbXCJfbW91bnRzXCJdID0gdGhpcy5qb2luQ291bnRcblxuICAgIHJldHVybiBwYXJhbXNcbiAgfVxuXG4gIGlzQ29ubmVjdGVkKCl7IHJldHVybiB0aGlzLmNoYW5uZWwuY2FuUHVzaCgpIH1cblxuICBnZXRTZXNzaW9uKCl7IHJldHVybiB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTikgfVxuXG4gIGdldFN0YXRpYygpe1xuICAgIGxldCB2YWwgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfU1RBVElDKVxuICAgIHJldHVybiB2YWwgPT09IFwiXCIgPyBudWxsIDogdmFsXG4gIH1cblxuICBkZXN0cm95KGNhbGxiYWNrID0gZnVuY3Rpb24gKCl7IH0pe1xuICAgIHRoaXMuZGVzdHJveUFsbENoaWxkcmVuKClcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWVcbiAgICBkZWxldGUgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdXG4gICAgaWYodGhpcy5wYXJlbnQpeyBkZWxldGUgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMucGFyZW50LmlkXVt0aGlzLmlkXSB9XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMubG9hZGVyVGltZXIpXG4gICAgbGV0IG9uRmluaXNoZWQgPSAoKSA9PiB7XG4gICAgICBjYWxsYmFjaygpXG4gICAgICBmb3IobGV0IGlkIGluIHRoaXMudmlld0hvb2tzKXtcbiAgICAgICAgdGhpcy5kZXN0cm95SG9vayh0aGlzLnZpZXdIb29rc1tpZF0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgRE9NLm1hcmtQaHhDaGlsZERlc3Ryb3llZCh0aGlzLmVsKVxuXG4gICAgdGhpcy5sb2coXCJkZXN0cm95ZWRcIiwgKCkgPT4gW1widGhlIGNoaWxkIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcGFyZW50XCJdKVxuICAgIHRoaXMuY2hhbm5lbC5sZWF2ZSgpXG4gICAgICAucmVjZWl2ZShcIm9rXCIsIG9uRmluaXNoZWQpXG4gICAgICAucmVjZWl2ZShcImVycm9yXCIsIG9uRmluaXNoZWQpXG4gICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgb25GaW5pc2hlZClcbiAgfVxuXG4gIHNldENvbnRhaW5lckNsYXNzZXMoLi4uY2xhc3Nlcyl7XG4gICAgdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKFxuICAgICAgUEhYX0NPTk5FQ1RFRF9DTEFTUyxcbiAgICAgIFBIWF9ESVNDT05ORUNURURfQ0xBU1MsXG4gICAgICBQSFhfRVJST1JfQ0xBU1NcbiAgICApXG4gICAgdGhpcy5lbC5jbGFzc0xpc3QuYWRkKC4uLmNsYXNzZXMpXG4gIH1cblxuICBpc0xvYWRpbmcoKXsgcmV0dXJuIHRoaXMuZWwuY2xhc3NMaXN0LmNvbnRhaW5zKFBIWF9ESVNDT05ORUNURURfQ0xBU1MpIH1cblxuICBzaG93TG9hZGVyKHRpbWVvdXQpe1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKVxuICAgIGlmKHRpbWVvdXQpe1xuICAgICAgdGhpcy5sb2FkZXJUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zaG93TG9hZGVyKCksIHRpbWVvdXQpXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcihsZXQgaWQgaW4gdGhpcy52aWV3SG9va3MpeyB0aGlzLnZpZXdIb29rc1tpZF0uX19kaXNjb25uZWN0ZWQoKSB9XG4gICAgICB0aGlzLnNldENvbnRhaW5lckNsYXNzZXMoUEhYX0RJU0NPTk5FQ1RFRF9DTEFTUylcbiAgICB9XG4gIH1cblxuICBoaWRlTG9hZGVyKCl7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMubG9hZGVyVGltZXIpXG4gICAgdGhpcy5zZXRDb250YWluZXJDbGFzc2VzKFBIWF9DT05ORUNURURfQ0xBU1MpXG4gIH1cblxuICB0cmlnZ2VyUmVjb25uZWN0ZWQoKXtcbiAgICBmb3IobGV0IGlkIGluIHRoaXMudmlld0hvb2tzKXsgdGhpcy52aWV3SG9va3NbaWRdLl9fcmVjb25uZWN0ZWQoKSB9XG4gIH1cblxuICBsb2coa2luZCwgbXNnQ2FsbGJhY2spe1xuICAgIHRoaXMubGl2ZVNvY2tldC5sb2codGhpcywga2luZCwgbXNnQ2FsbGJhY2spXG4gIH1cblxuICB3aXRoaW5UYXJnZXRzKHBoeFRhcmdldCwgY2FsbGJhY2spe1xuICAgIGlmKHBoeFRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KXtcbiAgICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQub3duZXIocGh4VGFyZ2V0LCB2aWV3ID0+IGNhbGxiYWNrKHZpZXcsIHBoeFRhcmdldCkpXG4gICAgfVxuXG4gICAgaWYoL14oMHxbMS05XVxcZCopJC8udGVzdChwaHhUYXJnZXQpKXtcbiAgICAgIGxldCB0YXJnZXRzID0gRE9NLmZpbmRDb21wb25lbnROb2RlTGlzdCh0aGlzLmVsLCBwaHhUYXJnZXQpXG4gICAgICBpZih0YXJnZXRzLmxlbmd0aCA9PT0gMCl7XG4gICAgICAgIGxvZ0Vycm9yKGBubyBjb21wb25lbnQgZm91bmQgbWF0Y2hpbmcgcGh4LXRhcmdldCBvZiAke3BoeFRhcmdldH1gKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2sodGhpcywgdGFyZ2V0c1swXSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHRhcmdldHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocGh4VGFyZ2V0KSlcbiAgICAgIGlmKHRhcmdldHMubGVuZ3RoID09PSAwKXsgbG9nRXJyb3IoYG5vdGhpbmcgZm91bmQgbWF0Y2hpbmcgdGhlIHBoeC10YXJnZXQgc2VsZWN0b3IgXCIke3BoeFRhcmdldH1cImApIH1cbiAgICAgIHRhcmdldHMuZm9yRWFjaCh0YXJnZXQgPT4gdGhpcy5saXZlU29ja2V0Lm93bmVyKHRhcmdldCwgdmlldyA9PiBjYWxsYmFjayh2aWV3LCB0YXJnZXQpKSlcbiAgICB9XG4gIH1cblxuICBhcHBseURpZmYodHlwZSwgcmF3RGlmZiwgY2FsbGJhY2spe1xuICAgIHRoaXMubG9nKHR5cGUsICgpID0+IFtcIlwiLCBjbG9uZShyYXdEaWZmKV0pXG4gICAgbGV0IHtkaWZmLCByZXBseSwgZXZlbnRzLCB0aXRsZX0gPSBSZW5kZXJlZC5leHRyYWN0KHJhd0RpZmYpXG4gICAgaWYodGl0bGUpeyBET00ucHV0VGl0bGUodGl0bGUpIH1cblxuICAgIGNhbGxiYWNrKHtkaWZmLCByZXBseSwgZXZlbnRzfSlcbiAgICByZXR1cm4gcmVwbHlcbiAgfVxuXG4gIG9uSm9pbihyZXNwKXtcbiAgICBsZXQge3JlbmRlcmVkLCBjb250YWluZXJ9ID0gcmVzcFxuICAgIGlmKGNvbnRhaW5lcil7XG4gICAgICBsZXQgW3RhZywgYXR0cnNdID0gY29udGFpbmVyXG4gICAgICB0aGlzLmVsID0gRE9NLnJlcGxhY2VSb290Q29udGFpbmVyKHRoaXMuZWwsIHRhZywgYXR0cnMpXG4gICAgfVxuICAgIHRoaXMuY2hpbGRKb2lucyA9IDBcbiAgICB0aGlzLmpvaW5QZW5kaW5nID0gdHJ1ZVxuICAgIHRoaXMuZmxhc2ggPSBudWxsXG5cbiAgICBCcm93c2VyLmRyb3BMb2NhbCh0aGlzLmxpdmVTb2NrZXQubG9jYWxTdG9yYWdlLCB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsIENPTlNFQ1VUSVZFX1JFTE9BRFMpXG4gICAgdGhpcy5hcHBseURpZmYoXCJtb3VudFwiLCByZW5kZXJlZCwgKHtkaWZmLCBldmVudHN9KSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVkID0gbmV3IFJlbmRlcmVkKHRoaXMuaWQsIGRpZmYpXG4gICAgICBsZXQgaHRtbCA9IHRoaXMucmVuZGVyQ29udGFpbmVyKG51bGwsIFwiam9pblwiKVxuICAgICAgdGhpcy5kcm9wUGVuZGluZ1JlZnMoKVxuICAgICAgbGV0IGZvcm1zID0gdGhpcy5mb3Jtc0ZvclJlY292ZXJ5KGh0bWwpXG4gICAgICB0aGlzLmpvaW5Db3VudCsrXG5cbiAgICAgIGlmKGZvcm1zLmxlbmd0aCA+IDApe1xuICAgICAgICBmb3Jtcy5mb3JFYWNoKChmb3JtLCBpKSA9PiB7XG4gICAgICAgICAgdGhpcy5wdXNoRm9ybVJlY292ZXJ5KGZvcm0sIHJlc3AgPT4ge1xuICAgICAgICAgICAgaWYoaSA9PT0gZm9ybXMubGVuZ3RoIC0gMSl7XG4gICAgICAgICAgICAgIHRoaXMub25Kb2luQ29tcGxldGUocmVzcCwgaHRtbCwgZXZlbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uSm9pbkNvbXBsZXRlKHJlc3AsIGh0bWwsIGV2ZW50cylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZHJvcFBlbmRpbmdSZWZzKCl7IERPTS5hbGwodGhpcy5lbCwgYFske1BIWF9SRUZ9XWAsIGVsID0+IGVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfUkVGKSkgfVxuXG4gIG9uSm9pbkNvbXBsZXRlKHtsaXZlX3BhdGNofSwgaHRtbCwgZXZlbnRzKXtcbiAgICAvLyBJbiBvcmRlciB0byBwcm92aWRlIGEgYmV0dGVyIGV4cGVyaWVuY2UsIHdlIHdhbnQgdG8gam9pblxuICAgIC8vIGFsbCBMaXZlVmlld3MgZmlyc3QgYW5kIG9ubHkgdGhlbiBhcHBseSB0aGVpciBwYXRjaGVzLlxuICAgIGlmKHRoaXMuam9pbkNvdW50ID4gMSB8fCAodGhpcy5wYXJlbnQgJiYgIXRoaXMucGFyZW50LmlzSm9pblBlbmRpbmcoKSkpe1xuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlKb2luUGF0Y2gobGl2ZV9wYXRjaCwgaHRtbCwgZXZlbnRzKVxuICAgIH1cblxuICAgIC8vIE9uZSBkb3duc2lkZSBvZiB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgd2UgbmVlZCB0byBmaW5kIHBoeENoaWxkcmVuXG4gICAgLy8gaW4gdGhlIGh0bWwgZnJhZ21lbnQsIGluc3RlYWQgb2YgZGlyZWN0bHkgb24gdGhlIERPTS4gVGhlIGZyYWdtZW50XG4gICAgLy8gYWxzbyBkb2VzIG5vdCBpbmNsdWRlIFBIWF9TVEFUSUMsIHNvIHdlIG5lZWQgdG8gY29weSBpdCBvdmVyIGZyb21cbiAgICAvLyB0aGUgRE9NLlxuICAgIGxldCBuZXdDaGlsZHJlbiA9IERPTS5maW5kUGh4Q2hpbGRyZW5JbkZyYWdtZW50KGh0bWwsIHRoaXMuaWQpLmZpbHRlcih0b0VsID0+IHtcbiAgICAgIGxldCBmcm9tRWwgPSB0b0VsLmlkICYmIHRoaXMuZWwucXVlcnlTZWxlY3RvcihgW2lkPVwiJHt0b0VsLmlkfVwiXWApXG4gICAgICBsZXQgcGh4U3RhdGljID0gZnJvbUVsICYmIGZyb21FbC5nZXRBdHRyaWJ1dGUoUEhYX1NUQVRJQylcbiAgICAgIGlmKHBoeFN0YXRpYyl7IHRvRWwuc2V0QXR0cmlidXRlKFBIWF9TVEFUSUMsIHBoeFN0YXRpYykgfVxuICAgICAgcmV0dXJuIHRoaXMuam9pbkNoaWxkKHRvRWwpXG4gICAgfSlcblxuICAgIGlmKG5ld0NoaWxkcmVuLmxlbmd0aCA9PT0gMCl7XG4gICAgICBpZih0aGlzLnBhcmVudCl7XG4gICAgICAgIHRoaXMucm9vdC5wZW5kaW5nSm9pbk9wcy5wdXNoKFt0aGlzLCAoKSA9PiB0aGlzLmFwcGx5Sm9pblBhdGNoKGxpdmVfcGF0Y2gsIGh0bWwsIGV2ZW50cyldKVxuICAgICAgICB0aGlzLnBhcmVudC5hY2tKb2luKHRoaXMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uQWxsQ2hpbGRKb2luc0NvbXBsZXRlKClcbiAgICAgICAgdGhpcy5hcHBseUpvaW5QYXRjaChsaXZlX3BhdGNoLCBodG1sLCBldmVudHMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucm9vdC5wZW5kaW5nSm9pbk9wcy5wdXNoKFt0aGlzLCAoKSA9PiB0aGlzLmFwcGx5Sm9pblBhdGNoKGxpdmVfcGF0Y2gsIGh0bWwsIGV2ZW50cyldKVxuICAgIH1cbiAgfVxuXG4gIGF0dGFjaFRydWVEb2NFbCgpe1xuICAgIHRoaXMuZWwgPSBET00uYnlJZCh0aGlzLmlkKVxuICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKFBIWF9ST09UX0lELCB0aGlzLnJvb3QuaWQpXG4gIH1cblxuICBkaXNwYXRjaEV2ZW50cyhldmVudHMpe1xuICAgIGV2ZW50cy5mb3JFYWNoKChbZXZlbnQsIHBheWxvYWRdKSA9PiB7XG4gICAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoYHBoeDpob29rOiR7ZXZlbnR9YCwge2RldGFpbDogcGF5bG9hZH0pKVxuICAgIH0pXG4gIH1cblxuICBhcHBseUpvaW5QYXRjaChsaXZlX3BhdGNoLCBodG1sLCBldmVudHMpe1xuICAgIHRoaXMuYXR0YWNoVHJ1ZURvY0VsKClcbiAgICBsZXQgcGF0Y2ggPSBuZXcgRE9NUGF0Y2godGhpcywgdGhpcy5lbCwgdGhpcy5pZCwgaHRtbCwgbnVsbClcbiAgICBwYXRjaC5tYXJrUHJ1bmFibGVDb250ZW50Rm9yUmVtb3ZhbCgpXG4gICAgdGhpcy5wZXJmb3JtUGF0Y2gocGF0Y2gsIGZhbHNlKVxuICAgIHRoaXMuam9pbk5ld0NoaWxkcmVuKClcbiAgICBET00uYWxsKHRoaXMuZWwsIGBbJHt0aGlzLmJpbmRpbmcoUEhYX0hPT0spfV0sIFtkYXRhLXBoeC0ke1BIWF9IT09LfV1gLCBob29rRWwgPT4ge1xuICAgICAgbGV0IGhvb2sgPSB0aGlzLmFkZEhvb2soaG9va0VsKVxuICAgICAgaWYoaG9vayl7IGhvb2suX19tb3VudGVkKCkgfVxuICAgIH0pXG5cbiAgICB0aGlzLmpvaW5QZW5kaW5nID0gZmFsc2VcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnRzKGV2ZW50cylcbiAgICB0aGlzLmFwcGx5UGVuZGluZ1VwZGF0ZXMoKVxuXG4gICAgaWYobGl2ZV9wYXRjaCl7XG4gICAgICBsZXQge2tpbmQsIHRvfSA9IGxpdmVfcGF0Y2hcbiAgICAgIHRoaXMubGl2ZVNvY2tldC5oaXN0b3J5UGF0Y2godG8sIGtpbmQpXG4gICAgfVxuICAgIHRoaXMuaGlkZUxvYWRlcigpXG4gICAgaWYodGhpcy5qb2luQ291bnQgPiAxKXsgdGhpcy50cmlnZ2VyUmVjb25uZWN0ZWQoKSB9XG4gICAgdGhpcy5zdG9wQ2FsbGJhY2soKVxuICB9XG5cbiAgdHJpZ2dlckJlZm9yZVVwZGF0ZUhvb2soZnJvbUVsLCB0b0VsKXtcbiAgICB0aGlzLmxpdmVTb2NrZXQudHJpZ2dlckRPTShcIm9uQmVmb3JlRWxVcGRhdGVkXCIsIFtmcm9tRWwsIHRvRWxdKVxuICAgIGxldCBob29rID0gdGhpcy5nZXRIb29rKGZyb21FbClcbiAgICBsZXQgaXNJZ25vcmVkID0gaG9vayAmJiBET00uaXNJZ25vcmVkKGZyb21FbCwgdGhpcy5iaW5kaW5nKFBIWF9VUERBVEUpKVxuICAgIGlmKGhvb2sgJiYgIWZyb21FbC5pc0VxdWFsTm9kZSh0b0VsKSAmJiAhKGlzSWdub3JlZCAmJiBpc0VxdWFsT2JqKGZyb21FbC5kYXRhc2V0LCB0b0VsLmRhdGFzZXQpKSl7XG4gICAgICBob29rLl9fYmVmb3JlVXBkYXRlKClcbiAgICAgIHJldHVybiBob29rXG4gICAgfVxuICB9XG5cbiAgcGVyZm9ybVBhdGNoKHBhdGNoLCBwcnVuZUNpZHMpe1xuICAgIGxldCBkZXN0cm95ZWRDSURzID0gW11cbiAgICBsZXQgcGh4Q2hpbGRyZW5BZGRlZCA9IGZhbHNlXG4gICAgbGV0IHVwZGF0ZWRIb29rSWRzID0gbmV3IFNldCgpXG5cbiAgICBwYXRjaC5hZnRlcihcImFkZGVkXCIsIGVsID0+IHtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC50cmlnZ2VyRE9NKFwib25Ob2RlQWRkZWRcIiwgW2VsXSlcblxuICAgICAgbGV0IG5ld0hvb2sgPSB0aGlzLmFkZEhvb2soZWwpXG4gICAgICBpZihuZXdIb29rKXsgbmV3SG9vay5fX21vdW50ZWQoKSB9XG4gICAgfSlcblxuICAgIHBhdGNoLmFmdGVyKFwicGh4Q2hpbGRBZGRlZFwiLCBfZWwgPT4gcGh4Q2hpbGRyZW5BZGRlZCA9IHRydWUpXG5cbiAgICBwYXRjaC5iZWZvcmUoXCJ1cGRhdGVkXCIsIChmcm9tRWwsIHRvRWwpID0+IHtcbiAgICAgIGxldCBob29rID0gdGhpcy50cmlnZ2VyQmVmb3JlVXBkYXRlSG9vayhmcm9tRWwsIHRvRWwpXG4gICAgICBpZihob29rKXsgdXBkYXRlZEhvb2tJZHMuYWRkKGZyb21FbC5pZCkgfVxuICAgIH0pXG5cbiAgICBwYXRjaC5hZnRlcihcInVwZGF0ZWRcIiwgZWwgPT4ge1xuICAgICAgaWYodXBkYXRlZEhvb2tJZHMuaGFzKGVsLmlkKSl7IHRoaXMuZ2V0SG9vayhlbCkuX191cGRhdGVkKCkgfVxuICAgIH0pXG5cbiAgICBwYXRjaC5hZnRlcihcImRpc2NhcmRlZFwiLCAoZWwpID0+IHtcbiAgICAgIGxldCBjaWQgPSB0aGlzLmNvbXBvbmVudElEKGVsKVxuICAgICAgaWYodHlwZW9mIChjaWQpID09PSBcIm51bWJlclwiICYmIGRlc3Ryb3llZENJRHMuaW5kZXhPZihjaWQpID09PSAtMSl7IGRlc3Ryb3llZENJRHMucHVzaChjaWQpIH1cbiAgICAgIGxldCBob29rID0gdGhpcy5nZXRIb29rKGVsKVxuICAgICAgaG9vayAmJiB0aGlzLmRlc3Ryb3lIb29rKGhvb2spXG4gICAgfSlcblxuICAgIHBhdGNoLnBlcmZvcm0oKVxuXG4gICAgLy8gV2Ugc2hvdWxkIG5vdCBwcnVuZUNpZHMgb24gam9pbnMuIE90aGVyd2lzZSwgaW4gY2FzZSBvZlxuICAgIC8vIHJlam9pbnMsIHdlIG1heSBub3RpZnkgY2lkcyB0aGF0IG5vIGxvbmdlciBiZWxvbmcgdG8gdGhlXG4gICAgLy8gY3VycmVudCBMaXZlVmlldyB0byBiZSByZW1vdmVkLlxuICAgIGlmKHBydW5lQ2lkcyl7XG4gICAgICB0aGlzLm1heWJlUHVzaENvbXBvbmVudHNEZXN0cm95ZWQoZGVzdHJveWVkQ0lEcylcbiAgICB9XG5cbiAgICByZXR1cm4gcGh4Q2hpbGRyZW5BZGRlZFxuICB9XG5cbiAgam9pbk5ld0NoaWxkcmVuKCl7XG4gICAgRE9NLmZpbmRQaHhDaGlsZHJlbih0aGlzLmVsLCB0aGlzLmlkKS5mb3JFYWNoKGVsID0+IHRoaXMuam9pbkNoaWxkKGVsKSlcbiAgfVxuXG4gIGdldENoaWxkQnlJZChpZCl7IHJldHVybiB0aGlzLnJvb3QuY2hpbGRyZW5bdGhpcy5pZF1baWRdIH1cblxuICBnZXREZXNjZW5kZW50QnlFbChlbCl7XG4gICAgaWYoZWwuaWQgPT09IHRoaXMuaWQpe1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW5bZWwuZ2V0QXR0cmlidXRlKFBIWF9QQVJFTlRfSUQpXVtlbC5pZF1cbiAgICB9XG4gIH1cblxuICBkZXN0cm95RGVzY2VuZGVudChpZCl7XG4gICAgZm9yKGxldCBwYXJlbnRJZCBpbiB0aGlzLnJvb3QuY2hpbGRyZW4pe1xuICAgICAgZm9yKGxldCBjaGlsZElkIGluIHRoaXMucm9vdC5jaGlsZHJlbltwYXJlbnRJZF0pe1xuICAgICAgICBpZihjaGlsZElkID09PSBpZCl7IHJldHVybiB0aGlzLnJvb3QuY2hpbGRyZW5bcGFyZW50SWRdW2NoaWxkSWRdLmRlc3Ryb3koKSB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgam9pbkNoaWxkKGVsKXtcbiAgICBsZXQgY2hpbGQgPSB0aGlzLmdldENoaWxkQnlJZChlbC5pZClcbiAgICBpZighY2hpbGQpe1xuICAgICAgbGV0IHZpZXcgPSBuZXcgVmlldyhlbCwgdGhpcy5saXZlU29ja2V0LCB0aGlzKVxuICAgICAgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdW3ZpZXcuaWRdID0gdmlld1xuICAgICAgdmlldy5qb2luKClcbiAgICAgIHRoaXMuY2hpbGRKb2lucysrXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIGlzSm9pblBlbmRpbmcoKXsgcmV0dXJuIHRoaXMuam9pblBlbmRpbmcgfVxuXG4gIGFja0pvaW4oX2NoaWxkKXtcbiAgICB0aGlzLmNoaWxkSm9pbnMtLVxuXG4gICAgaWYodGhpcy5jaGlsZEpvaW5zID09PSAwKXtcbiAgICAgIGlmKHRoaXMucGFyZW50KXtcbiAgICAgICAgdGhpcy5wYXJlbnQuYWNrSm9pbih0aGlzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbkFsbENoaWxkSm9pbnNDb21wbGV0ZSgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25BbGxDaGlsZEpvaW5zQ29tcGxldGUoKXtcbiAgICB0aGlzLmpvaW5DYWxsYmFjaygpXG4gICAgdGhpcy5wZW5kaW5nSm9pbk9wcy5mb3JFYWNoKChbdmlldywgb3BdKSA9PiB7XG4gICAgICBpZighdmlldy5pc0Rlc3Ryb3llZCgpKXsgb3AoKSB9XG4gICAgfSlcbiAgICB0aGlzLnBlbmRpbmdKb2luT3BzID0gW11cbiAgfVxuXG4gIHVwZGF0ZShkaWZmLCBldmVudHMpe1xuICAgIGlmKHRoaXMuaXNKb2luUGVuZGluZygpIHx8IHRoaXMubGl2ZVNvY2tldC5oYXNQZW5kaW5nTGluaygpKXtcbiAgICAgIHJldHVybiB0aGlzLnBlbmRpbmdEaWZmcy5wdXNoKHtkaWZmLCBldmVudHN9KVxuICAgIH1cblxuICAgIHRoaXMucmVuZGVyZWQubWVyZ2VEaWZmKGRpZmYpXG4gICAgbGV0IHBoeENoaWxkcmVuQWRkZWQgPSBmYWxzZVxuXG4gICAgLy8gV2hlbiB0aGUgZGlmZiBvbmx5IGNvbnRhaW5zIGNvbXBvbmVudCBkaWZmcywgdGhlbiB3YWxrIGNvbXBvbmVudHNcbiAgICAvLyBhbmQgcGF0Y2ggb25seSB0aGUgcGFyZW50IGNvbXBvbmVudCBjb250YWluZXJzIGZvdW5kIGluIHRoZSBkaWZmLlxuICAgIC8vIE90aGVyd2lzZSwgcGF0Y2ggZW50aXJlIExWIGNvbnRhaW5lci5cbiAgICBpZih0aGlzLnJlbmRlcmVkLmlzQ29tcG9uZW50T25seURpZmYoZGlmZikpe1xuICAgICAgdGhpcy5saXZlU29ja2V0LnRpbWUoXCJjb21wb25lbnQgcGF0Y2ggY29tcGxldGVcIiwgKCkgPT4ge1xuICAgICAgICBsZXQgcGFyZW50Q2lkcyA9IERPTS5maW5kUGFyZW50Q0lEcyh0aGlzLmVsLCB0aGlzLnJlbmRlcmVkLmNvbXBvbmVudENJRHMoZGlmZikpXG4gICAgICAgIHBhcmVudENpZHMuZm9yRWFjaChwYXJlbnRDSUQgPT4ge1xuICAgICAgICAgIGlmKHRoaXMuY29tcG9uZW50UGF0Y2godGhpcy5yZW5kZXJlZC5nZXRDb21wb25lbnQoZGlmZiwgcGFyZW50Q0lEKSwgcGFyZW50Q0lEKSl7IHBoeENoaWxkcmVuQWRkZWQgPSB0cnVlIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmKCFpc0VtcHR5KGRpZmYpKXtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC50aW1lKFwiZnVsbCBwYXRjaCBjb21wbGV0ZVwiLCAoKSA9PiB7XG4gICAgICAgIGxldCBodG1sID0gdGhpcy5yZW5kZXJDb250YWluZXIoZGlmZiwgXCJ1cGRhdGVcIilcbiAgICAgICAgbGV0IHBhdGNoID0gbmV3IERPTVBhdGNoKHRoaXMsIHRoaXMuZWwsIHRoaXMuaWQsIGh0bWwsIG51bGwpXG4gICAgICAgIHBoeENoaWxkcmVuQWRkZWQgPSB0aGlzLnBlcmZvcm1QYXRjaChwYXRjaCwgdHJ1ZSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50cyhldmVudHMpXG4gICAgaWYocGh4Q2hpbGRyZW5BZGRlZCl7IHRoaXMuam9pbk5ld0NoaWxkcmVuKCkgfVxuICB9XG5cbiAgcmVuZGVyQ29udGFpbmVyKGRpZmYsIGtpbmQpe1xuICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQudGltZShgdG9TdHJpbmcgZGlmZiAoJHtraW5kfSlgLCAoKSA9PiB7XG4gICAgICBsZXQgdGFnID0gdGhpcy5lbC50YWdOYW1lXG4gICAgICAvLyBEb24ndCBza2lwIGFueSBjb21wb25lbnQgaW4gdGhlIGRpZmYgbm9yIGFueSBtYXJrZWQgYXMgcHJ1bmVkXG4gICAgICAvLyAoYXMgdGhleSBtYXkgaGF2ZSBiZWVuIGFkZGVkIGJhY2spXG4gICAgICBsZXQgY2lkcyA9IGRpZmYgPyB0aGlzLnJlbmRlcmVkLmNvbXBvbmVudENJRHMoZGlmZikuY29uY2F0KHRoaXMucHJ1bmluZ0NJRHMpIDogbnVsbFxuICAgICAgbGV0IGh0bWwgPSB0aGlzLnJlbmRlcmVkLnRvU3RyaW5nKGNpZHMpXG4gICAgICByZXR1cm4gYDwke3RhZ30+JHtodG1sfTwvJHt0YWd9PmBcbiAgICB9KVxuICB9XG5cbiAgY29tcG9uZW50UGF0Y2goZGlmZiwgY2lkKXtcbiAgICBpZihpc0VtcHR5KGRpZmYpKSByZXR1cm4gZmFsc2VcbiAgICBsZXQgaHRtbCA9IHRoaXMucmVuZGVyZWQuY29tcG9uZW50VG9TdHJpbmcoY2lkKVxuICAgIGxldCBwYXRjaCA9IG5ldyBET01QYXRjaCh0aGlzLCB0aGlzLmVsLCB0aGlzLmlkLCBodG1sLCBjaWQpXG4gICAgbGV0IGNoaWxkcmVuQWRkZWQgPSB0aGlzLnBlcmZvcm1QYXRjaChwYXRjaCwgdHJ1ZSlcbiAgICByZXR1cm4gY2hpbGRyZW5BZGRlZFxuICB9XG5cbiAgZ2V0SG9vayhlbCl7IHJldHVybiB0aGlzLnZpZXdIb29rc1tWaWV3SG9vay5lbGVtZW50SUQoZWwpXSB9XG5cbiAgYWRkSG9vayhlbCl7XG4gICAgaWYoVmlld0hvb2suZWxlbWVudElEKGVsKSB8fCAhZWwuZ2V0QXR0cmlidXRlKXsgcmV0dXJuIH1cbiAgICBsZXQgaG9va05hbWUgPSBlbC5nZXRBdHRyaWJ1dGUoYGRhdGEtcGh4LSR7UEhYX0hPT0t9YCkgfHwgZWwuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfSE9PSykpXG4gICAgaWYoaG9va05hbWUgJiYgIXRoaXMub3duc0VsZW1lbnQoZWwpKXsgcmV0dXJuIH1cbiAgICBsZXQgY2FsbGJhY2tzID0gdGhpcy5saXZlU29ja2V0LmdldEhvb2tDYWxsYmFja3MoaG9va05hbWUpXG5cbiAgICBpZihjYWxsYmFja3Mpe1xuICAgICAgaWYoIWVsLmlkKXsgbG9nRXJyb3IoYG5vIERPTSBJRCBmb3IgaG9vayBcIiR7aG9va05hbWV9XCIuIEhvb2tzIHJlcXVpcmUgYSB1bmlxdWUgSUQgb24gZWFjaCBlbGVtZW50LmAsIGVsKSB9XG4gICAgICBsZXQgaG9vayA9IG5ldyBWaWV3SG9vayh0aGlzLCBlbCwgY2FsbGJhY2tzKVxuICAgICAgdGhpcy52aWV3SG9va3NbVmlld0hvb2suZWxlbWVudElEKGhvb2suZWwpXSA9IGhvb2tcbiAgICAgIHJldHVybiBob29rXG4gICAgfSBlbHNlIGlmKGhvb2tOYW1lICE9PSBudWxsKXtcbiAgICAgIGxvZ0Vycm9yKGB1bmtub3duIGhvb2sgZm91bmQgZm9yIFwiJHtob29rTmFtZX1cImAsIGVsKVxuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3lIb29rKGhvb2spe1xuICAgIGhvb2suX19kZXN0cm95ZWQoKVxuICAgIGhvb2suX19jbGVhbnVwX18oKVxuICAgIGRlbGV0ZSB0aGlzLnZpZXdIb29rc1tWaWV3SG9vay5lbGVtZW50SUQoaG9vay5lbCldXG4gIH1cblxuICBhcHBseVBlbmRpbmdVcGRhdGVzKCl7XG4gICAgdGhpcy5wZW5kaW5nRGlmZnMuZm9yRWFjaCgoe2RpZmYsIGV2ZW50c30pID0+IHRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cykpXG4gICAgdGhpcy5wZW5kaW5nRGlmZnMgPSBbXVxuICB9XG5cbiAgb25DaGFubmVsKGV2ZW50LCBjYil7XG4gICAgdGhpcy5saXZlU29ja2V0Lm9uQ2hhbm5lbCh0aGlzLmNoYW5uZWwsIGV2ZW50LCByZXNwID0+IHtcbiAgICAgIGlmKHRoaXMuaXNKb2luUGVuZGluZygpKXtcbiAgICAgICAgdGhpcy5yb290LnBlbmRpbmdKb2luT3BzLnB1c2goW3RoaXMsICgpID0+IGNiKHJlc3ApXSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNiKHJlc3ApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGJpbmRDaGFubmVsKCl7XG4gICAgLy8gVGhlIGRpZmYgZXZlbnQgc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIHJlZ3VsYXIgdXBkYXRlIG9wZXJhdGlvbnMuXG4gICAgLy8gQWxsIG90aGVyIG9wZXJhdGlvbnMgYXJlIHF1ZXVlZCB0byBiZSBhcHBsaWVkIG9ubHkgYWZ0ZXIgam9pbi5cbiAgICB0aGlzLmxpdmVTb2NrZXQub25DaGFubmVsKHRoaXMuY2hhbm5lbCwgXCJkaWZmXCIsIChyYXdEaWZmKSA9PiB7XG4gICAgICB0aGlzLmFwcGx5RGlmZihcInVwZGF0ZVwiLCByYXdEaWZmLCAoe2RpZmYsIGV2ZW50c30pID0+IHRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cykpXG4gICAgfSlcbiAgICB0aGlzLm9uQ2hhbm5lbChcInJlZGlyZWN0XCIsICh7dG8sIGZsYXNofSkgPT4gdGhpcy5vblJlZGlyZWN0KHt0bywgZmxhc2h9KSlcbiAgICB0aGlzLm9uQ2hhbm5lbChcImxpdmVfcGF0Y2hcIiwgKHJlZGlyKSA9PiB0aGlzLm9uTGl2ZVBhdGNoKHJlZGlyKSlcbiAgICB0aGlzLm9uQ2hhbm5lbChcImxpdmVfcmVkaXJlY3RcIiwgKHJlZGlyKSA9PiB0aGlzLm9uTGl2ZVJlZGlyZWN0KHJlZGlyKSlcbiAgICB0aGlzLmNoYW5uZWwub25FcnJvcihyZWFzb24gPT4gdGhpcy5vbkVycm9yKHJlYXNvbikpXG4gICAgdGhpcy5jaGFubmVsLm9uQ2xvc2UocmVhc29uID0+IHRoaXMub25DbG9zZShyZWFzb24pKVxuICB9XG5cbiAgZGVzdHJveUFsbENoaWxkcmVuKCl7XG4gICAgZm9yKGxldCBpZCBpbiB0aGlzLnJvb3QuY2hpbGRyZW5bdGhpcy5pZF0pe1xuICAgICAgdGhpcy5nZXRDaGlsZEJ5SWQoaWQpLmRlc3Ryb3koKVxuICAgIH1cbiAgfVxuXG4gIG9uTGl2ZVJlZGlyZWN0KHJlZGlyKXtcbiAgICBsZXQge3RvLCBraW5kLCBmbGFzaH0gPSByZWRpclxuICAgIGxldCB1cmwgPSB0aGlzLmV4cGFuZFVSTCh0bylcbiAgICB0aGlzLmxpdmVTb2NrZXQuaGlzdG9yeVJlZGlyZWN0KHVybCwga2luZCwgZmxhc2gpXG4gIH1cblxuICBvbkxpdmVQYXRjaChyZWRpcil7XG4gICAgbGV0IHt0bywga2luZH0gPSByZWRpclxuICAgIHRoaXMuaHJlZiA9IHRoaXMuZXhwYW5kVVJMKHRvKVxuICAgIHRoaXMubGl2ZVNvY2tldC5oaXN0b3J5UGF0Y2godG8sIGtpbmQpXG4gIH1cblxuICBleHBhbmRVUkwodG8pe1xuICAgIHJldHVybiB0by5zdGFydHNXaXRoKFwiL1wiKSA/IGAke3dpbmRvdy5sb2NhdGlvbi5wcm90b2NvbH0vLyR7d2luZG93LmxvY2F0aW9uLmhvc3R9JHt0b31gIDogdG9cbiAgfVxuXG4gIG9uUmVkaXJlY3Qoe3RvLCBmbGFzaH0peyB0aGlzLmxpdmVTb2NrZXQucmVkaXJlY3QodG8sIGZsYXNoKSB9XG5cbiAgaXNEZXN0cm95ZWQoKXsgcmV0dXJuIHRoaXMuZGVzdHJveWVkIH1cblxuICBqb2luKGNhbGxiYWNrKXtcbiAgICBpZighdGhpcy5wYXJlbnQpe1xuICAgICAgdGhpcy5zdG9wQ2FsbGJhY2sgPSB0aGlzLmxpdmVTb2NrZXQud2l0aFBhZ2VMb2FkaW5nKHt0bzogdGhpcy5ocmVmLCBraW5kOiBcImluaXRpYWxcIn0pXG4gICAgfVxuICAgIHRoaXMuam9pbkNhbGxiYWNrID0gKCkgPT4gY2FsbGJhY2sgJiYgY2FsbGJhY2sodGhpcy5qb2luQ291bnQpXG4gICAgdGhpcy5saXZlU29ja2V0LndyYXBQdXNoKHRoaXMsIHt0aW1lb3V0OiBmYWxzZX0sICgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNoYW5uZWwuam9pbigpXG4gICAgICAgIC5yZWNlaXZlKFwib2tcIiwgZGF0YSA9PiAhdGhpcy5pc0Rlc3Ryb3llZCgpICYmIHRoaXMub25Kb2luKGRhdGEpKVxuICAgICAgICAucmVjZWl2ZShcImVycm9yXCIsIHJlc3AgPT4gIXRoaXMuaXNEZXN0cm95ZWQoKSAmJiB0aGlzLm9uSm9pbkVycm9yKHJlc3ApKVxuICAgICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgKCkgPT4gIXRoaXMuaXNEZXN0cm95ZWQoKSAmJiB0aGlzLm9uSm9pbkVycm9yKHtyZWFzb246IFwidGltZW91dFwifSkpXG4gICAgfSlcbiAgfVxuXG4gIG9uSm9pbkVycm9yKHJlc3Ape1xuICAgIGlmKHJlc3AucmVhc29uID09PSBcInVuYXV0aG9yaXplZFwiIHx8IHJlc3AucmVhc29uID09PSBcInN0YWxlXCIpe1xuICAgICAgdGhpcy5sb2coXCJlcnJvclwiLCAoKSA9PiBbXCJ1bmF1dGhvcml6ZWQgbGl2ZV9yZWRpcmVjdC4gRmFsbGluZyBiYWNrIHRvIHBhZ2UgcmVxdWVzdFwiLCByZXNwXSlcbiAgICAgIHJldHVybiB0aGlzLm9uUmVkaXJlY3Qoe3RvOiB0aGlzLmhyZWZ9KVxuICAgIH1cbiAgICBpZihyZXNwLnJlZGlyZWN0IHx8IHJlc3AubGl2ZV9yZWRpcmVjdCl7XG4gICAgICB0aGlzLmpvaW5QZW5kaW5nID0gZmFsc2VcbiAgICAgIHRoaXMuY2hhbm5lbC5sZWF2ZSgpXG4gICAgfVxuICAgIGlmKHJlc3AucmVkaXJlY3QpeyByZXR1cm4gdGhpcy5vblJlZGlyZWN0KHJlc3AucmVkaXJlY3QpIH1cbiAgICBpZihyZXNwLmxpdmVfcmVkaXJlY3QpeyByZXR1cm4gdGhpcy5vbkxpdmVSZWRpcmVjdChyZXNwLmxpdmVfcmVkaXJlY3QpIH1cbiAgICB0aGlzLmxvZyhcImVycm9yXCIsICgpID0+IFtcInVuYWJsZSB0byBqb2luXCIsIHJlc3BdKVxuICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQucmVsb2FkV2l0aEppdHRlcih0aGlzKVxuICB9XG5cbiAgb25DbG9zZShyZWFzb24pe1xuICAgIGlmKHRoaXMuaXNEZXN0cm95ZWQoKSl7IHJldHVybiB9XG4gICAgaWYoKHRoaXMuaXNKb2luUGVuZGluZygpICYmIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSAhPT0gXCJoaWRkZW5cIikgfHxcbiAgICAgICh0aGlzLmxpdmVTb2NrZXQuaGFzUGVuZGluZ0xpbmsoKSAmJiByZWFzb24gIT09IFwibGVhdmVcIikpe1xuXG4gICAgICByZXR1cm4gdGhpcy5saXZlU29ja2V0LnJlbG9hZFdpdGhKaXR0ZXIodGhpcylcbiAgICB9XG4gICAgdGhpcy5kZXN0cm95QWxsQ2hpbGRyZW4oKVxuICAgIHRoaXMubGl2ZVNvY2tldC5kcm9wQWN0aXZlRWxlbWVudCh0aGlzKVxuICAgIC8vIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgY2FuIGJlIG51bGwgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTFcbiAgICBpZihkb2N1bWVudC5hY3RpdmVFbGVtZW50KXsgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyKCkgfVxuICAgIGlmKHRoaXMubGl2ZVNvY2tldC5pc1VubG9hZGVkKCkpe1xuICAgICAgdGhpcy5zaG93TG9hZGVyKEJFRk9SRV9VTkxPQURfTE9BREVSX1RJTUVPVVQpXG4gICAgfVxuICB9XG5cbiAgb25FcnJvcihyZWFzb24pe1xuICAgIHRoaXMub25DbG9zZShyZWFzb24pXG4gICAgdGhpcy5sb2coXCJlcnJvclwiLCAoKSA9PiBbXCJ2aWV3IGNyYXNoZWRcIiwgcmVhc29uXSlcbiAgICBpZighdGhpcy5saXZlU29ja2V0LmlzVW5sb2FkZWQoKSl7IHRoaXMuZGlzcGxheUVycm9yKCkgfVxuICB9XG5cbiAgZGlzcGxheUVycm9yKCl7XG4gICAgaWYodGhpcy5pc01haW4oKSl7IERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6cGFnZS1sb2FkaW5nLXN0YXJ0XCIsIHt0bzogdGhpcy5ocmVmLCBraW5kOiBcImVycm9yXCJ9KSB9XG4gICAgdGhpcy5zaG93TG9hZGVyKClcbiAgICB0aGlzLnNldENvbnRhaW5lckNsYXNzZXMoUEhYX0RJU0NPTk5FQ1RFRF9DTEFTUywgUEhYX0VSUk9SX0NMQVNTKVxuICB9XG5cbiAgcHVzaFdpdGhSZXBseShyZWZHZW5lcmF0b3IsIGV2ZW50LCBwYXlsb2FkLCBvblJlcGx5ID0gZnVuY3Rpb24gKCl7IH0pe1xuICAgIGlmKCF0aGlzLmlzQ29ubmVjdGVkKCkpeyByZXR1cm4gfVxuXG4gICAgbGV0IFtyZWYsIFtlbF1dID0gcmVmR2VuZXJhdG9yID8gcmVmR2VuZXJhdG9yKCkgOiBbbnVsbCwgW11dXG4gICAgbGV0IG9uTG9hZGluZ0RvbmUgPSBmdW5jdGlvbiAoKXsgfVxuICAgIGlmKGVsICYmIChlbC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9QQUdFX0xPQURJTkcpKSAhPT0gbnVsbCkpe1xuICAgICAgb25Mb2FkaW5nRG9uZSA9IHRoaXMubGl2ZVNvY2tldC53aXRoUGFnZUxvYWRpbmcoe2tpbmQ6IFwiZWxlbWVudFwiLCB0YXJnZXQ6IGVsfSlcbiAgICB9XG5cbiAgICBpZih0eXBlb2YgKHBheWxvYWQuY2lkKSAhPT0gXCJudW1iZXJcIil7IGRlbGV0ZSBwYXlsb2FkLmNpZCB9XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMubGl2ZVNvY2tldC53cmFwUHVzaCh0aGlzLCB7dGltZW91dDogdHJ1ZX0sICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbm5lbC5wdXNoKGV2ZW50LCBwYXlsb2FkLCBQVVNIX1RJTUVPVVQpLnJlY2VpdmUoXCJva1wiLCByZXNwID0+IHtcbiAgICAgICAgICBsZXQgaG9va1JlcGx5ID0gbnVsbFxuICAgICAgICAgIGlmKHJlZiAhPT0gbnVsbCl7IHRoaXMudW5kb1JlZnMocmVmKSB9XG4gICAgICAgICAgaWYocmVzcC5kaWZmKXtcbiAgICAgICAgICAgIGhvb2tSZXBseSA9IHRoaXMuYXBwbHlEaWZmKFwidXBkYXRlXCIsIHJlc3AuZGlmZiwgKHtkaWZmLCBldmVudHN9KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cylcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHJlc3AucmVkaXJlY3QpeyB0aGlzLm9uUmVkaXJlY3QocmVzcC5yZWRpcmVjdCkgfVxuICAgICAgICAgIGlmKHJlc3AubGl2ZV9wYXRjaCl7IHRoaXMub25MaXZlUGF0Y2gocmVzcC5saXZlX3BhdGNoKSB9XG4gICAgICAgICAgaWYocmVzcC5saXZlX3JlZGlyZWN0KXsgdGhpcy5vbkxpdmVSZWRpcmVjdChyZXNwLmxpdmVfcmVkaXJlY3QpIH1cbiAgICAgICAgICBvbkxvYWRpbmdEb25lKClcbiAgICAgICAgICBvblJlcGx5KHJlc3AsIGhvb2tSZXBseSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgdW5kb1JlZnMocmVmKXtcbiAgICBET00uYWxsKHRoaXMuZWwsIGBbJHtQSFhfUkVGfT1cIiR7cmVmfVwiXWAsIGVsID0+IHtcbiAgICAgIGxldCBkaXNhYmxlZFZhbCA9IGVsLmdldEF0dHJpYnV0ZShQSFhfRElTQUJMRUQpXG4gICAgICAvLyByZW1vdmUgcmVmc1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUYpXG4gICAgICAvLyByZXN0b3JlIGlucHV0c1xuICAgICAgaWYoZWwuZ2V0QXR0cmlidXRlKFBIWF9SRUFET05MWSkgIT09IG51bGwpe1xuICAgICAgICBlbC5yZWFkT25seSA9IGZhbHNlXG4gICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfUkVBRE9OTFkpXG4gICAgICB9XG4gICAgICBpZihkaXNhYmxlZFZhbCAhPT0gbnVsbCl7XG4gICAgICAgIGVsLmRpc2FibGVkID0gZGlzYWJsZWRWYWwgPT09IFwidHJ1ZVwiID8gdHJ1ZSA6IGZhbHNlXG4gICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfRElTQUJMRUQpXG4gICAgICB9XG4gICAgICAvLyByZW1vdmUgY2xhc3Nlc1xuICAgICAgUEhYX0VWRU5UX0NMQVNTRVMuZm9yRWFjaChjbGFzc05hbWUgPT4gRE9NLnJlbW92ZUNsYXNzKGVsLCBjbGFzc05hbWUpKVxuICAgICAgLy8gcmVzdG9yZSBkaXNhYmxlc1xuICAgICAgbGV0IGRpc2FibGVSZXN0b3JlID0gZWwuZ2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSlcbiAgICAgIGlmKGRpc2FibGVSZXN0b3JlICE9PSBudWxsKXtcbiAgICAgICAgZWwuaW5uZXJUZXh0ID0gZGlzYWJsZVJlc3RvcmVcbiAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSlcbiAgICAgIH1cbiAgICAgIGxldCB0b0VsID0gRE9NLnByaXZhdGUoZWwsIFBIWF9SRUYpXG4gICAgICBpZih0b0VsKXtcbiAgICAgICAgbGV0IGhvb2sgPSB0aGlzLnRyaWdnZXJCZWZvcmVVcGRhdGVIb29rKGVsLCB0b0VsKVxuICAgICAgICBET01QYXRjaC5wYXRjaEVsKGVsLCB0b0VsLCB0aGlzLmxpdmVTb2NrZXQuZ2V0QWN0aXZlRWxlbWVudCgpKVxuICAgICAgICBpZihob29rKXsgaG9vay5fX3VwZGF0ZWQoKSB9XG4gICAgICAgIERPTS5kZWxldGVQcml2YXRlKGVsLCBQSFhfUkVGKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwdXRSZWYoZWxlbWVudHMsIGV2ZW50KXtcbiAgICBsZXQgbmV3UmVmID0gdGhpcy5yZWYrK1xuICAgIGxldCBkaXNhYmxlV2l0aCA9IHRoaXMuYmluZGluZyhQSFhfRElTQUJMRV9XSVRIKVxuXG4gICAgZWxlbWVudHMuZm9yRWFjaChlbCA9PiB7XG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKGBwaHgtJHtldmVudH0tbG9hZGluZ2ApXG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoUEhYX1JFRiwgbmV3UmVmKVxuICAgICAgbGV0IGRpc2FibGVUZXh0ID0gZWwuZ2V0QXR0cmlidXRlKGRpc2FibGVXaXRoKVxuICAgICAgaWYoZGlzYWJsZVRleHQgIT09IG51bGwpe1xuICAgICAgICBpZighZWwuZ2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFX1dJVEhfUkVTVE9SRSkpe1xuICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUsIGVsLmlubmVyVGV4dClcbiAgICAgICAgfVxuICAgICAgICBlbC5pbm5lclRleHQgPSBkaXNhYmxlVGV4dFxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIFtuZXdSZWYsIGVsZW1lbnRzXVxuICB9XG5cbiAgY29tcG9uZW50SUQoZWwpe1xuICAgIGxldCBjaWQgPSBlbC5nZXRBdHRyaWJ1dGUgJiYgZWwuZ2V0QXR0cmlidXRlKFBIWF9DT01QT05FTlQpXG4gICAgcmV0dXJuIGNpZCA/IHBhcnNlSW50KGNpZCkgOiBudWxsXG4gIH1cblxuICB0YXJnZXRDb21wb25lbnRJRCh0YXJnZXQsIHRhcmdldEN0eCl7XG4gICAgaWYodGFyZ2V0LmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJ0YXJnZXRcIikpKXtcbiAgICAgIHJldHVybiB0aGlzLmNsb3Nlc3RDb21wb25lbnRJRCh0YXJnZXRDdHgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgY2xvc2VzdENvbXBvbmVudElEKHRhcmdldEN0eCl7XG4gICAgaWYodGFyZ2V0Q3R4KXtcbiAgICAgIHJldHVybiBtYXliZSh0YXJnZXRDdHguY2xvc2VzdChgWyR7UEhYX0NPTVBPTkVOVH1dYCksIGVsID0+IHRoaXMub3duc0VsZW1lbnQoZWwpICYmIHRoaXMuY29tcG9uZW50SUQoZWwpKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHB1c2hIb29rRXZlbnQodGFyZ2V0Q3R4LCBldmVudCwgcGF5bG9hZCwgb25SZXBseSl7XG4gICAgaWYoIXRoaXMuaXNDb25uZWN0ZWQoKSl7XG4gICAgICB0aGlzLmxvZyhcImhvb2tcIiwgKCkgPT4gW1widW5hYmxlIHRvIHB1c2ggaG9vayBldmVudC4gTGl2ZVZpZXcgbm90IGNvbm5lY3RlZFwiLCBldmVudCwgcGF5bG9hZF0pXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgbGV0IFtyZWYsIGVsc10gPSB0aGlzLnB1dFJlZihbXSwgXCJob29rXCIpXG4gICAgdGhpcy5wdXNoV2l0aFJlcGx5KCgpID0+IFtyZWYsIGVsc10sIFwiZXZlbnRcIiwge1xuICAgICAgdHlwZTogXCJob29rXCIsXG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICB2YWx1ZTogcGF5bG9hZCxcbiAgICAgIGNpZDogdGhpcy5jbG9zZXN0Q29tcG9uZW50SUQodGFyZ2V0Q3R4KVxuICAgIH0sIChyZXNwLCByZXBseSkgPT4gb25SZXBseShyZXBseSwgcmVmKSlcblxuICAgIHJldHVybiByZWZcbiAgfVxuXG4gIGV4dHJhY3RNZXRhKGVsLCBtZXRhKXtcbiAgICBsZXQgcHJlZml4ID0gdGhpcy5iaW5kaW5nKFwidmFsdWUtXCIpXG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGVsLmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspe1xuICAgICAgbGV0IG5hbWUgPSBlbC5hdHRyaWJ1dGVzW2ldLm5hbWVcbiAgICAgIGlmKG5hbWUuc3RhcnRzV2l0aChwcmVmaXgpKXsgbWV0YVtuYW1lLnJlcGxhY2UocHJlZml4LCBcIlwiKV0gPSBlbC5nZXRBdHRyaWJ1dGUobmFtZSkgfVxuICAgIH1cbiAgICBpZihlbC52YWx1ZSAhPT0gdW5kZWZpbmVkKXtcbiAgICAgIG1ldGEudmFsdWUgPSBlbC52YWx1ZVxuXG4gICAgICBpZihlbC50YWdOYW1lID09PSBcIklOUFVUXCIgJiYgQ0hFQ0tBQkxFX0lOUFVUUy5pbmRleE9mKGVsLnR5cGUpID49IDAgJiYgIWVsLmNoZWNrZWQpe1xuICAgICAgICBkZWxldGUgbWV0YS52YWx1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWV0YVxuICB9XG5cbiAgcHVzaEV2ZW50KHR5cGUsIGVsLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBtZXRhKXtcbiAgICB0aGlzLnB1c2hXaXRoUmVwbHkoKCkgPT4gdGhpcy5wdXRSZWYoW2VsXSwgdHlwZSksIFwiZXZlbnRcIiwge1xuICAgICAgdHlwZTogdHlwZSxcbiAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgIHZhbHVlOiB0aGlzLmV4dHJhY3RNZXRhKGVsLCBtZXRhKSxcbiAgICAgIGNpZDogdGhpcy50YXJnZXRDb21wb25lbnRJRChlbCwgdGFyZ2V0Q3R4KVxuICAgIH0pXG4gIH1cblxuICBwdXNoS2V5KGtleUVsZW1lbnQsIHRhcmdldEN0eCwga2luZCwgcGh4RXZlbnQsIG1ldGEpe1xuICAgIHRoaXMucHVzaFdpdGhSZXBseSgoKSA9PiB0aGlzLnB1dFJlZihba2V5RWxlbWVudF0sIGtpbmQpLCBcImV2ZW50XCIsIHtcbiAgICAgIHR5cGU6IGtpbmQsXG4gICAgICBldmVudDogcGh4RXZlbnQsXG4gICAgICB2YWx1ZTogdGhpcy5leHRyYWN0TWV0YShrZXlFbGVtZW50LCBtZXRhKSxcbiAgICAgIGNpZDogdGhpcy50YXJnZXRDb21wb25lbnRJRChrZXlFbGVtZW50LCB0YXJnZXRDdHgpXG4gICAgfSlcbiAgfVxuXG4gIHB1c2hGaWxlUHJvZ3Jlc3MoZmlsZUVsLCBlbnRyeVJlZiwgcHJvZ3Jlc3MsIG9uUmVwbHkgPSBmdW5jdGlvbiAoKXsgfSl7XG4gICAgdGhpcy5saXZlU29ja2V0LndpdGhpbk93bmVycyhmaWxlRWwuZm9ybSwgKHZpZXcsIHRhcmdldEN0eCkgPT4ge1xuICAgICAgdmlldy5wdXNoV2l0aFJlcGx5KG51bGwsIFwicHJvZ3Jlc3NcIiwge1xuICAgICAgICBldmVudDogZmlsZUVsLmdldEF0dHJpYnV0ZSh2aWV3LmJpbmRpbmcoUEhYX1BST0dSRVNTKSksXG4gICAgICAgIHJlZjogZmlsZUVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRiksXG4gICAgICAgIGVudHJ5X3JlZjogZW50cnlSZWYsXG4gICAgICAgIHByb2dyZXNzOiBwcm9ncmVzcyxcbiAgICAgICAgY2lkOiB2aWV3LnRhcmdldENvbXBvbmVudElEKGZpbGVFbC5mb3JtLCB0YXJnZXRDdHgpXG4gICAgICB9LCBvblJlcGx5KVxuICAgIH0pXG4gIH1cblxuICBwdXNoSW5wdXQoaW5wdXRFbCwgdGFyZ2V0Q3R4LCBwaHhFdmVudCwgZXZlbnRUYXJnZXQsIGNhbGxiYWNrKXtcbiAgICBsZXQgdXBsb2Fkc1xuICAgIGxldCBjaWQgPSB0aGlzLnRhcmdldENvbXBvbmVudElEKGlucHV0RWwuZm9ybSwgdGFyZ2V0Q3R4KVxuICAgIGxldCByZWZHZW5lcmF0b3IgPSAoKSA9PiB0aGlzLnB1dFJlZihbaW5wdXRFbCwgaW5wdXRFbC5mb3JtXSwgXCJjaGFuZ2VcIilcbiAgICBsZXQgZm9ybURhdGEgPSBzZXJpYWxpemVGb3JtKGlucHV0RWwuZm9ybSwge190YXJnZXQ6IGV2ZW50VGFyZ2V0Lm5hbWV9KVxuICAgIGlmKGlucHV0RWwuZmlsZXMgJiYgaW5wdXRFbC5maWxlcy5sZW5ndGggPiAwKXtcbiAgICAgIExpdmVVcGxvYWRlci50cmFja0ZpbGVzKGlucHV0RWwsIEFycmF5LmZyb20oaW5wdXRFbC5maWxlcykpXG4gICAgfVxuICAgIHVwbG9hZHMgPSBMaXZlVXBsb2FkZXIuc2VyaWFsaXplVXBsb2FkcyhpbnB1dEVsKVxuICAgIGxldCBldmVudCA9IHtcbiAgICAgIHR5cGU6IFwiZm9ybVwiLFxuICAgICAgZXZlbnQ6IHBoeEV2ZW50LFxuICAgICAgdmFsdWU6IGZvcm1EYXRhLFxuICAgICAgdXBsb2FkczogdXBsb2FkcyxcbiAgICAgIGNpZDogY2lkXG4gICAgfVxuICAgIHRoaXMucHVzaFdpdGhSZXBseShyZWZHZW5lcmF0b3IsIFwiZXZlbnRcIiwgZXZlbnQsIHJlc3AgPT4ge1xuICAgICAgRE9NLnNob3dFcnJvcihpbnB1dEVsLCB0aGlzLmxpdmVTb2NrZXQuYmluZGluZyhQSFhfRkVFREJBQ0tfRk9SKSlcbiAgICAgIGlmKERPTS5pc1VwbG9hZElucHV0KGlucHV0RWwpICYmIGlucHV0RWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtYXV0by11cGxvYWRcIikgIT09IG51bGwpe1xuICAgICAgICBpZihMaXZlVXBsb2FkZXIuZmlsZXNBd2FpdGluZ1ByZWZsaWdodChpbnB1dEVsKS5sZW5ndGggPiAwKXtcbiAgICAgICAgICBsZXQgW3JlZiwgX2Vsc10gPSByZWZHZW5lcmF0b3IoKVxuICAgICAgICAgIHRoaXMudXBsb2FkRmlsZXMoaW5wdXRFbC5mb3JtLCB0YXJnZXRDdHgsIHJlZiwgY2lkLCAoX3VwbG9hZHMpID0+IHtcbiAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKHJlc3ApXG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJBd2FpdGluZ1N1Ym1pdChpbnB1dEVsLmZvcm0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2socmVzcClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgdHJpZ2dlckF3YWl0aW5nU3VibWl0KGZvcm1FbCl7XG4gICAgbGV0IGF3YWl0aW5nU3VibWl0ID0gdGhpcy5nZXRTY2hlZHVsZWRTdWJtaXQoZm9ybUVsKVxuICAgIGlmKGF3YWl0aW5nU3VibWl0KXtcbiAgICAgIGxldCBbX2VsLCBfcmVmLCBjYWxsYmFja10gPSBhd2FpdGluZ1N1Ym1pdFxuICAgICAgdGhpcy5jYW5jZWxTdWJtaXQoZm9ybUVsKVxuICAgICAgY2FsbGJhY2soKVxuICAgIH1cbiAgfVxuXG4gIGdldFNjaGVkdWxlZFN1Ym1pdChmb3JtRWwpe1xuICAgIHJldHVybiB0aGlzLmZvcm1TdWJtaXRzLmZpbmQoKFtlbCwgX2NhbGxiYWNrXSkgPT4gZWwuaXNTYW1lTm9kZShmb3JtRWwpKVxuICB9XG5cbiAgc2NoZWR1bGVTdWJtaXQoZm9ybUVsLCByZWYsIGNhbGxiYWNrKXtcbiAgICBpZih0aGlzLmdldFNjaGVkdWxlZFN1Ym1pdChmb3JtRWwpKXsgcmV0dXJuIHRydWUgfVxuICAgIHRoaXMuZm9ybVN1Ym1pdHMucHVzaChbZm9ybUVsLCByZWYsIGNhbGxiYWNrXSlcbiAgfVxuXG4gIGNhbmNlbFN1Ym1pdChmb3JtRWwpe1xuICAgIHRoaXMuZm9ybVN1Ym1pdHMgPSB0aGlzLmZvcm1TdWJtaXRzLmZpbHRlcigoW2VsLCByZWYsIF9jYWxsYmFja10pID0+IHtcbiAgICAgIGlmKGVsLmlzU2FtZU5vZGUoZm9ybUVsKSl7XG4gICAgICAgIHRoaXMudW5kb1JlZnMocmVmKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHB1c2hGb3JtU3VibWl0KGZvcm1FbCwgdGFyZ2V0Q3R4LCBwaHhFdmVudCwgb25SZXBseSl7XG4gICAgbGV0IGZpbHRlcklnbm9yZWQgPSBlbCA9PiB7XG4gICAgICBsZXQgdXNlcklnbm9yZWQgPSBjbG9zZXN0UGh4QmluZGluZyhlbCwgYCR7dGhpcy5iaW5kaW5nKFBIWF9VUERBVEUpfT1pZ25vcmVgLCBlbC5mb3JtKVxuICAgICAgcmV0dXJuICEodXNlcklnbm9yZWQgfHwgY2xvc2VzdFBoeEJpbmRpbmcoZWwsIFwiZGF0YS1waHgtdXBkYXRlPWlnbm9yZVwiLCBlbC5mb3JtKSlcbiAgICB9XG4gICAgbGV0IGZpbHRlckRpc2FibGVzID0gZWwgPT4ge1xuICAgICAgcmV0dXJuIGVsLmhhc0F0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoUEhYX0RJU0FCTEVfV0lUSCkpXG4gICAgfVxuICAgIGxldCBmaWx0ZXJCdXR0b24gPSBlbCA9PiBlbC50YWdOYW1lID09IFwiQlVUVE9OXCJcblxuICAgIGxldCBmaWx0ZXJJbnB1dCA9IGVsID0+IFtcIklOUFVUXCIsIFwiVEVYVEFSRUFcIiwgXCJTRUxFQ1RcIl0uaW5jbHVkZXMoZWwudGFnTmFtZSlcblxuICAgIGxldCByZWZHZW5lcmF0b3IgPSAoKSA9PiB7XG4gICAgICBsZXQgZm9ybUVsZW1lbnRzID0gQXJyYXkuZnJvbShmb3JtRWwuZWxlbWVudHMpXG4gICAgICBsZXQgZGlzYWJsZXMgPSBmb3JtRWxlbWVudHMuZmlsdGVyKGZpbHRlckRpc2FibGVzKVxuICAgICAgbGV0IGJ1dHRvbnMgPSBmb3JtRWxlbWVudHMuZmlsdGVyKGZpbHRlckJ1dHRvbikuZmlsdGVyKGZpbHRlcklnbm9yZWQpXG4gICAgICBsZXQgaW5wdXRzID0gZm9ybUVsZW1lbnRzLmZpbHRlcihmaWx0ZXJJbnB1dCkuZmlsdGVyKGZpbHRlcklnbm9yZWQpXG5cbiAgICAgIGJ1dHRvbnMuZm9yRWFjaChidXR0b24gPT4ge1xuICAgICAgICBidXR0b24uc2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFRCwgYnV0dG9uLmRpc2FibGVkKVxuICAgICAgICBidXR0b24uZGlzYWJsZWQgPSB0cnVlXG4gICAgICB9KVxuICAgICAgaW5wdXRzLmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoUEhYX1JFQURPTkxZLCBpbnB1dC5yZWFkT25seSlcbiAgICAgICAgaW5wdXQucmVhZE9ubHkgPSB0cnVlXG4gICAgICAgIGlmKGlucHV0LmZpbGVzKXtcbiAgICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoUEhYX0RJU0FCTEVELCBpbnB1dC5kaXNhYmxlZClcbiAgICAgICAgICBpbnB1dC5kaXNhYmxlZCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIGZvcm1FbC5zZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9QQUdFX0xPQURJTkcpLCBcIlwiKVxuICAgICAgcmV0dXJuIHRoaXMucHV0UmVmKFtmb3JtRWxdLmNvbmNhdChkaXNhYmxlcykuY29uY2F0KGJ1dHRvbnMpLmNvbmNhdChpbnB1dHMpLCBcInN1Ym1pdFwiKVxuICAgIH1cblxuICAgIGxldCBjaWQgPSB0aGlzLnRhcmdldENvbXBvbmVudElEKGZvcm1FbCwgdGFyZ2V0Q3R4KVxuICAgIGlmKExpdmVVcGxvYWRlci5oYXNVcGxvYWRzSW5Qcm9ncmVzcyhmb3JtRWwpKXtcbiAgICAgIGxldCBbcmVmLCBfZWxzXSA9IHJlZkdlbmVyYXRvcigpXG4gICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZVN1Ym1pdChmb3JtRWwsIHJlZiwgKCkgPT4gdGhpcy5wdXNoRm9ybVN1Ym1pdChmb3JtRWwsIHRhcmdldEN0eCwgcGh4RXZlbnQsIG9uUmVwbHkpKVxuICAgIH0gZWxzZSBpZihMaXZlVXBsb2FkZXIuaW5wdXRzQXdhaXRpbmdQcmVmbGlnaHQoZm9ybUVsKS5sZW5ndGggPiAwKXtcbiAgICAgIGxldCBbcmVmLCBlbHNdID0gcmVmR2VuZXJhdG9yKClcbiAgICAgIGxldCBwcm94eVJlZkdlbiA9ICgpID0+IFtyZWYsIGVsc11cbiAgICAgIHRoaXMudXBsb2FkRmlsZXMoZm9ybUVsLCB0YXJnZXRDdHgsIHJlZiwgY2lkLCAoX3VwbG9hZHMpID0+IHtcbiAgICAgICAgbGV0IGZvcm1EYXRhID0gc2VyaWFsaXplRm9ybShmb3JtRWwsIHt9KVxuICAgICAgICB0aGlzLnB1c2hXaXRoUmVwbHkocHJveHlSZWZHZW4sIFwiZXZlbnRcIiwge1xuICAgICAgICAgIHR5cGU6IFwiZm9ybVwiLFxuICAgICAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgICAgICB2YWx1ZTogZm9ybURhdGEsXG4gICAgICAgICAgY2lkOiBjaWRcbiAgICAgICAgfSwgb25SZXBseSlcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBmb3JtRGF0YSA9IHNlcmlhbGl6ZUZvcm0oZm9ybUVsKVxuICAgICAgdGhpcy5wdXNoV2l0aFJlcGx5KHJlZkdlbmVyYXRvciwgXCJldmVudFwiLCB7XG4gICAgICAgIHR5cGU6IFwiZm9ybVwiLFxuICAgICAgICBldmVudDogcGh4RXZlbnQsXG4gICAgICAgIHZhbHVlOiBmb3JtRGF0YSxcbiAgICAgICAgY2lkOiBjaWRcbiAgICAgIH0sIG9uUmVwbHkpXG4gICAgfVxuICB9XG5cbiAgdXBsb2FkRmlsZXMoZm9ybUVsLCB0YXJnZXRDdHgsIHJlZiwgY2lkLCBvbkNvbXBsZXRlKXtcbiAgICBsZXQgam9pbkNvdW50QXRVcGxvYWQgPSB0aGlzLmpvaW5Db3VudFxuICAgIGxldCBpbnB1dEVscyA9IExpdmVVcGxvYWRlci5hY3RpdmVGaWxlSW5wdXRzKGZvcm1FbClcbiAgICBsZXQgbnVtRmlsZUlucHV0c0luUHJvZ3Jlc3MgPSBpbnB1dEVscy5sZW5ndGhcblxuICAgIC8vIGdldCBlYWNoIGZpbGUgaW5wdXRcbiAgICBpbnB1dEVscy5mb3JFYWNoKGlucHV0RWwgPT4ge1xuICAgICAgbGV0IHVwbG9hZGVyID0gbmV3IExpdmVVcGxvYWRlcihpbnB1dEVsLCB0aGlzLCAoKSA9PiB7XG4gICAgICAgIG51bUZpbGVJbnB1dHNJblByb2dyZXNzLS1cbiAgICAgICAgaWYobnVtRmlsZUlucHV0c0luUHJvZ3Jlc3MgPT09IDApeyBvbkNvbXBsZXRlKCkgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMudXBsb2FkZXJzW2lucHV0RWxdID0gdXBsb2FkZXJcbiAgICAgIGxldCBlbnRyaWVzID0gdXBsb2FkZXIuZW50cmllcygpLm1hcChlbnRyeSA9PiBlbnRyeS50b1ByZWZsaWdodFBheWxvYWQoKSlcblxuICAgICAgbGV0IHBheWxvYWQgPSB7XG4gICAgICAgIHJlZjogaW5wdXRFbC5nZXRBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpLFxuICAgICAgICBlbnRyaWVzOiBlbnRyaWVzLFxuICAgICAgICBjaWQ6IHRoaXMudGFyZ2V0Q29tcG9uZW50SUQoaW5wdXRFbC5mb3JtLCB0YXJnZXRDdHgpXG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nKFwidXBsb2FkXCIsICgpID0+IFtcInNlbmRpbmcgcHJlZmxpZ2h0IHJlcXVlc3RcIiwgcGF5bG9hZF0pXG5cbiAgICAgIHRoaXMucHVzaFdpdGhSZXBseShudWxsLCBcImFsbG93X3VwbG9hZFwiLCBwYXlsb2FkLCByZXNwID0+IHtcbiAgICAgICAgdGhpcy5sb2coXCJ1cGxvYWRcIiwgKCkgPT4gW1wiZ290IHByZWZsaWdodCByZXNwb25zZVwiLCByZXNwXSlcbiAgICAgICAgaWYocmVzcC5lcnJvcil7XG4gICAgICAgICAgdGhpcy51bmRvUmVmcyhyZWYpXG4gICAgICAgICAgbGV0IFtlbnRyeV9yZWYsIHJlYXNvbl0gPSByZXNwLmVycm9yXG4gICAgICAgICAgdGhpcy5sb2coXCJ1cGxvYWRcIiwgKCkgPT4gW2BlcnJvciBmb3IgZW50cnkgJHtlbnRyeV9yZWZ9YCwgcmVhc29uXSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgb25FcnJvciA9IChjYWxsYmFjaykgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGFubmVsLm9uRXJyb3IoKCkgPT4ge1xuICAgICAgICAgICAgICBpZih0aGlzLmpvaW5Db3VudCA9PT0gam9pbkNvdW50QXRVcGxvYWQpeyBjYWxsYmFjaygpIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIHVwbG9hZGVyLmluaXRBZGFwdGVyVXBsb2FkKHJlc3AsIG9uRXJyb3IsIHRoaXMubGl2ZVNvY2tldClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgZGlzcGF0Y2hVcGxvYWRzKG5hbWUsIGZpbGVzT3JCbG9icyl7XG4gICAgbGV0IGlucHV0cyA9IERPTS5maW5kVXBsb2FkSW5wdXRzKHRoaXMuZWwpLmZpbHRlcihlbCA9PiBlbC5uYW1lID09PSBuYW1lKVxuICAgIGlmKGlucHV0cy5sZW5ndGggPT09IDApeyBsb2dFcnJvcihgbm8gbGl2ZSBmaWxlIGlucHV0cyBmb3VuZCBtYXRjaGluZyB0aGUgbmFtZSBcIiR7bmFtZX1cImApIH1cbiAgICBlbHNlIGlmKGlucHV0cy5sZW5ndGggPiAxKXsgbG9nRXJyb3IoYGR1cGxpY2F0ZSBsaXZlIGZpbGUgaW5wdXRzIGZvdW5kIG1hdGNoaW5nIHRoZSBuYW1lIFwiJHtuYW1lfVwiYCkgfVxuICAgIGVsc2UgeyBET00uZGlzcGF0Y2hFdmVudChpbnB1dHNbMF0sIFBIWF9UUkFDS19VUExPQURTLCB7ZmlsZXM6IGZpbGVzT3JCbG9ic30pIH1cbiAgfVxuXG4gIHB1c2hGb3JtUmVjb3ZlcnkoZm9ybSwgY2FsbGJhY2spe1xuICAgIHRoaXMubGl2ZVNvY2tldC53aXRoaW5Pd25lcnMoZm9ybSwgKHZpZXcsIHRhcmdldEN0eCkgPT4ge1xuICAgICAgbGV0IGlucHV0ID0gZm9ybS5lbGVtZW50c1swXVxuICAgICAgbGV0IHBoeEV2ZW50ID0gZm9ybS5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9BVVRPX1JFQ09WRVIpKSB8fCBmb3JtLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJjaGFuZ2VcIikpXG4gICAgICB2aWV3LnB1c2hJbnB1dChpbnB1dCwgdGFyZ2V0Q3R4LCBwaHhFdmVudCwgaW5wdXQsIGNhbGxiYWNrKVxuICAgIH0pXG4gIH1cblxuICBwdXNoTGlua1BhdGNoKGhyZWYsIHRhcmdldEVsLCBjYWxsYmFjayl7XG4gICAgbGV0IGxpbmtSZWYgPSB0aGlzLmxpdmVTb2NrZXQuc2V0UGVuZGluZ0xpbmsoaHJlZilcbiAgICBsZXQgcmVmR2VuID0gdGFyZ2V0RWwgPyAoKSA9PiB0aGlzLnB1dFJlZihbdGFyZ2V0RWxdLCBcImNsaWNrXCIpIDogbnVsbFxuXG4gICAgdGhpcy5wdXNoV2l0aFJlcGx5KHJlZkdlbiwgXCJsaXZlX3BhdGNoXCIsIHt1cmw6IGhyZWZ9LCByZXNwID0+IHtcbiAgICAgIGlmKHJlc3AubGlua19yZWRpcmVjdCl7XG4gICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXBsYWNlTWFpbihocmVmLCBudWxsLCBjYWxsYmFjaywgbGlua1JlZilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmKHRoaXMubGl2ZVNvY2tldC5jb21taXRQZW5kaW5nTGluayhsaW5rUmVmKSl7XG4gICAgICAgICAgdGhpcy5ocmVmID0gaHJlZlxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwbHlQZW5kaW5nVXBkYXRlcygpXG4gICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGxpbmtSZWYpXG4gICAgICB9XG4gICAgfSkucmVjZWl2ZShcInRpbWVvdXRcIiwgKCkgPT4gdGhpcy5saXZlU29ja2V0LnJlZGlyZWN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmKSlcbiAgfVxuXG4gIGZvcm1zRm9yUmVjb3ZlcnkoaHRtbCl7XG4gICAgaWYodGhpcy5qb2luQ291bnQgPT09IDApeyByZXR1cm4gW10gfVxuXG4gICAgbGV0IHBoeENoYW5nZSA9IHRoaXMuYmluZGluZyhcImNoYW5nZVwiKVxuICAgIGxldCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKVxuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGh0bWxcblxuICAgIHJldHVybiAoXG4gICAgICBET00uYWxsKHRoaXMuZWwsIGBmb3JtWyR7cGh4Q2hhbmdlfV1gKVxuICAgICAgICAuZmlsdGVyKGZvcm0gPT4gdGhpcy5vd25zRWxlbWVudChmb3JtKSlcbiAgICAgICAgLmZpbHRlcihmb3JtID0+IGZvcm0uZWxlbWVudHMubGVuZ3RoID4gMClcbiAgICAgICAgLmZpbHRlcihmb3JtID0+IGZvcm0uZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfQVVUT19SRUNPVkVSKSkgIT09IFwiaWdub3JlXCIpXG4gICAgICAgIC5maWx0ZXIoZm9ybSA9PiB0ZW1wbGF0ZS5jb250ZW50LnF1ZXJ5U2VsZWN0b3IoYGZvcm1bJHtwaHhDaGFuZ2V9PVwiJHtmb3JtLmdldEF0dHJpYnV0ZShwaHhDaGFuZ2UpfVwiXWApKVxuICAgIClcbiAgfVxuXG4gIG1heWJlUHVzaENvbXBvbmVudHNEZXN0cm95ZWQoZGVzdHJveWVkQ0lEcyl7XG4gICAgbGV0IHdpbGxEZXN0cm95Q0lEcyA9IGRlc3Ryb3llZENJRHMuZmlsdGVyKGNpZCA9PiB7XG4gICAgICByZXR1cm4gRE9NLmZpbmRDb21wb25lbnROb2RlTGlzdCh0aGlzLmVsLCBjaWQpLmxlbmd0aCA9PT0gMFxuICAgIH0pXG4gICAgaWYod2lsbERlc3Ryb3lDSURzLmxlbmd0aCA+IDApe1xuICAgICAgdGhpcy5wcnVuaW5nQ0lEcy5wdXNoKC4uLndpbGxEZXN0cm95Q0lEcylcblxuICAgICAgdGhpcy5wdXNoV2l0aFJlcGx5KG51bGwsIFwiY2lkc193aWxsX2Rlc3Ryb3lcIiwge2NpZHM6IHdpbGxEZXN0cm95Q0lEc30sICgpID0+IHtcbiAgICAgICAgLy8gVGhlIGNpZHMgYXJlIGVpdGhlciBiYWNrIG9uIHRoZSBwYWdlIG9yIHRoZXkgd2lsbCBiZSBmdWxseSByZW1vdmVkLFxuICAgICAgICAvLyBzbyB3ZSBjYW4gcmVtb3ZlIHRoZW0gZnJvbSB0aGUgcHJ1bmluZ0NJRHMuXG4gICAgICAgIHRoaXMucHJ1bmluZ0NJRHMgPSB0aGlzLnBydW5pbmdDSURzLmZpbHRlcihjaWQgPT4gd2lsbERlc3Ryb3lDSURzLmluZGV4T2YoY2lkKSAhPT0gLTEpXG5cbiAgICAgICAgLy8gU2VlIGlmIGFueSBvZiB0aGUgY2lkcyB3ZSB3YW50ZWQgdG8gZGVzdHJveSB3ZXJlIGFkZGVkIGJhY2ssXG4gICAgICAgIC8vIGlmIHRoZXkgd2VyZSBhZGRlZCBiYWNrLCB3ZSBkb24ndCBhY3R1YWxseSBkZXN0cm95IHRoZW0uXG4gICAgICAgIGxldCBjb21wbGV0ZWx5RGVzdHJveUNJRHMgPSB3aWxsRGVzdHJveUNJRHMuZmlsdGVyKGNpZCA9PiB7XG4gICAgICAgICAgcmV0dXJuIERPTS5maW5kQ29tcG9uZW50Tm9kZUxpc3QodGhpcy5lbCwgY2lkKS5sZW5ndGggPT09IDBcbiAgICAgICAgfSlcblxuICAgICAgICBpZihjb21wbGV0ZWx5RGVzdHJveUNJRHMubGVuZ3RoID4gMCl7XG4gICAgICAgICAgdGhpcy5wdXNoV2l0aFJlcGx5KG51bGwsIFwiY2lkc19kZXN0cm95ZWRcIiwge2NpZHM6IGNvbXBsZXRlbHlEZXN0cm95Q0lEc30sIChyZXNwKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVkLnBydW5lQ0lEcyhyZXNwLmNpZHMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBvd25zRWxlbWVudChlbCl7XG4gICAgcmV0dXJuIGVsLmdldEF0dHJpYnV0ZShQSFhfUEFSRU5UX0lEKSA9PT0gdGhpcy5pZCB8fFxuICAgICAgbWF5YmUoZWwuY2xvc2VzdChQSFhfVklFV19TRUxFQ1RPUiksIG5vZGUgPT4gbm9kZS5pZCkgPT09IHRoaXMuaWRcbiAgfVxuXG4gIHN1Ym1pdEZvcm0oZm9ybSwgdGFyZ2V0Q3R4LCBwaHhFdmVudCl7XG4gICAgRE9NLnB1dFByaXZhdGUoZm9ybSwgUEhYX0hBU19TVUJNSVRURUQsIHRydWUpXG4gICAgdGhpcy5saXZlU29ja2V0LmJsdXJBY3RpdmVFbGVtZW50KHRoaXMpXG4gICAgdGhpcy5wdXNoRm9ybVN1Ym1pdChmb3JtLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCAoKSA9PiB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQucmVzdG9yZVByZXZpb3VzbHlBY3RpdmVGb2N1cygpXG4gICAgfSlcbiAgfVxuXG4gIGJpbmRpbmcoa2luZCl7IHJldHVybiB0aGlzLmxpdmVTb2NrZXQuYmluZGluZyhraW5kKSB9XG59XG4iLCAiLyoqIEluaXRpYWxpemVzIHRoZSBMaXZlU29ja2V0XG4gKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmRQb2ludCAtIFRoZSBzdHJpbmcgV2ViU29ja2V0IGVuZHBvaW50LCBpZSwgYFwid3NzOi8vZXhhbXBsZS5jb20vbGl2ZVwiYCxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgXCIvbGl2ZVwiYCAoaW5oZXJpdGVkIGhvc3QgJiBwcm90b2NvbClcbiAqIEBwYXJhbSB7UGhvZW5peC5Tb2NrZXR9IHNvY2tldCAtIHRoZSByZXF1aXJlZCBQaG9lbml4IFNvY2tldCBjbGFzcyBpbXBvcnRlZCBmcm9tIFwicGhvZW5peFwiLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgICAgaW1wb3J0IHtTb2NrZXR9IGZyb20gXCJwaG9lbml4XCJcbiAqICAgICBpbXBvcnQge0xpdmVTb2NrZXR9IGZyb20gXCJwaG9lbml4X2xpdmVfdmlld1wiXG4gKiAgICAgbGV0IGxpdmVTb2NrZXQgPSBuZXcgTGl2ZVNvY2tldChcIi9saXZlXCIsIFNvY2tldCwgey4uLn0pXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzXSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24uIE91dHNpZGUgb2Yga2V5cyBsaXN0ZWQgYmVsb3csIGFsbFxuICogY29uZmlndXJhdGlvbiBpcyBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIFBob2VuaXggU29ja2V0IGNvbnN0cnVjdG9yLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzLmRlZmF1bHRzXSAtIFRoZSBvcHRpb25hbCBkZWZhdWx0cyB0byB1c2UgZm9yIHZhcmlvdXMgYmluZGluZ3MsXG4gKiBzdWNoIGFzIGBwaHgtZGVib3VuY2VgLiBTdXBwb3J0cyB0aGUgZm9sbG93aW5nIGtleXM6XG4gKlxuICogICAtIGRlYm91bmNlIC0gdGhlIG1pbGxpc2Vjb25kIHBoeC1kZWJvdW5jZSB0aW1lLiBEZWZhdWx0cyAzMDBcbiAqICAgLSB0aHJvdHRsZSAtIHRoZSBtaWxsaXNlY29uZCBwaHgtdGhyb3R0bGUgdGltZS4gRGVmYXVsdHMgMzAwXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMucGFyYW1zXSAtIFRoZSBvcHRpb25hbCBmdW5jdGlvbiBmb3IgcGFzc2luZyBjb25uZWN0IHBhcmFtcy5cbiAqIFRoZSBmdW5jdGlvbiByZWNlaXZlcyB0aGUgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBMaXZlVmlldy4gRm9yIGV4YW1wbGU6XG4gKlxuICogICAgIChlbCkgPT4ge3ZpZXc6IGVsLmdldEF0dHJpYnV0ZShcImRhdGEtbXktdmlldy1uYW1lXCIsIHRva2VuOiB3aW5kb3cubXlUb2tlbn1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuYmluZGluZ1ByZWZpeF0gLSBUaGUgb3B0aW9uYWwgcHJlZml4IHRvIHVzZSBmb3IgYWxsIHBoeCBET00gYW5ub3RhdGlvbnMuXG4gKiBEZWZhdWx0cyB0byBcInBoeC1cIi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0cy5ob29rc10gLSBUaGUgb3B0aW9uYWwgb2JqZWN0IGZvciByZWZlcmVuY2luZyBMaXZlVmlldyBob29rIGNhbGxiYWNrcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0cy51cGxvYWRlcnNdIC0gVGhlIG9wdGlvbmFsIG9iamVjdCBmb3IgcmVmZXJlbmNpbmcgTGl2ZVZpZXcgdXBsb2FkZXIgY2FsbGJhY2tzLlxuICogQHBhcmFtIHtpbnRlZ2VyfSBbb3B0cy5sb2FkZXJUaW1lb3V0XSAtIFRoZSBvcHRpb25hbCBkZWxheSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgYXBwbHlcbiAqIGxvYWRpbmcgc3RhdGVzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMudmlld0xvZ2dlcl0gLSBUaGUgb3B0aW9uYWwgZnVuY3Rpb24gdG8gbG9nIGRlYnVnIGluZm9ybWF0aW9uLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgICAgKHZpZXcsIGtpbmQsIG1zZywgb2JqKSA9PiBjb25zb2xlLmxvZyhgJHt2aWV3LmlkfSAke2tpbmR9OiAke21zZ30gLSBgLCBvYmopXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzLm1ldGFkYXRhXSAtIFRoZSBvcHRpb25hbCBvYmplY3QgbWFwcGluZyBldmVudCBuYW1lcyB0byBmdW5jdGlvbnMgZm9yXG4gKiBwb3B1bGF0aW5nIGV2ZW50IG1ldGFkYXRhLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgICAgbWV0YWRhdGE6IHtcbiAqICAgICAgIGNsaWNrOiAoZSwgZWwpID0+IHtcbiAqICAgICAgICAgcmV0dXJuIHtcbiAqICAgICAgICAgICBjdHJsS2V5OiBlLmN0cmxLZXksXG4gKiAgICAgICAgICAgbWV0YUtleTogZS5tZXRhS2V5LFxuICogICAgICAgICAgIGRldGFpbDogZS5kZXRhaWwgfHwgMSxcbiAqICAgICAgICAgfVxuICogICAgICAgfSxcbiAqICAgICAgIGtleWRvd246IChlLCBlbCkgPT4ge1xuICogICAgICAgICByZXR1cm4ge1xuICogICAgICAgICAgIGtleTogZS5rZXksXG4gKiAgICAgICAgICAgY3RybEtleTogZS5jdHJsS2V5LFxuICogICAgICAgICAgIG1ldGFLZXk6IGUubWV0YUtleSxcbiAqICAgICAgICAgICBzaGlmdEtleTogZS5zaGlmdEtleVxuICogICAgICAgICB9XG4gKiAgICAgICB9XG4gKiAgICAgfVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzLnNlc3Npb25TdG9yYWdlXSAtIEFuIG9wdGlvbmFsIFN0b3JhZ2UgY29tcGF0aWJsZSBvYmplY3RcbiAqIFVzZWZ1bCB3aGVuIExpdmVWaWV3IHdvbid0IGhhdmUgYWNjZXNzIHRvIGBzZXNzaW9uU3RvcmFnZWAuICBGb3IgZXhhbXBsZSwgVGhpcyBjb3VsZFxuICogaGFwcGVuIGlmIGEgc2l0ZSBsb2FkcyBhIGNyb3NzLWRvbWFpbiBMaXZlVmlldyBpbiBhbiBpZnJhbWUuICBFeGFtcGxlIHVzYWdlOlxuICpcbiAqICAgICBjbGFzcyBJbk1lbW9yeVN0b3JhZ2Uge1xuICogICAgICAgY29uc3RydWN0b3IoKSB7IHRoaXMuc3RvcmFnZSA9IHt9IH1cbiAqICAgICAgIGdldEl0ZW0oa2V5TmFtZSkgeyByZXR1cm4gdGhpcy5zdG9yYWdlW2tleU5hbWVdIH1cbiAqICAgICAgIHJlbW92ZUl0ZW0oa2V5TmFtZSkgeyBkZWxldGUgdGhpcy5zdG9yYWdlW2tleU5hbWVdIH1cbiAqICAgICAgIHNldEl0ZW0oa2V5TmFtZSwga2V5VmFsdWUpIHsgdGhpcy5zdG9yYWdlW2tleU5hbWVdID0ga2V5VmFsdWUgfVxuICogICAgIH1cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHMubG9jYWxTdG9yYWdlXSAtIEFuIG9wdGlvbmFsIFN0b3JhZ2UgY29tcGF0aWJsZSBvYmplY3RcbiAqIFVzZWZ1bCBmb3Igd2hlbiBMaXZlVmlldyB3b24ndCBoYXZlIGFjY2VzcyB0byBgbG9jYWxTdG9yYWdlYC5cbiAqIFNlZSBgb3B0cy5zZXNzaW9uU3RvcmFnZWAgZm9yIGV4YW1wbGVzLlxuKi9cblxuaW1wb3J0IHtcbiAgQklORElOR19QUkVGSVgsXG4gIENPTlNFQ1VUSVZFX1JFTE9BRFMsXG4gIERFRkFVTFRTLFxuICBGQUlMU0FGRV9KSVRURVIsXG4gIExPQURFUl9USU1FT1VULFxuICBNQVhfUkVMT0FEUyxcbiAgUEhYX0RFQk9VTkNFLFxuICBQSFhfRFJPUF9UQVJHRVQsXG4gIFBIWF9IQVNfRk9DVVNFRCxcbiAgUEhYX0tFWSxcbiAgUEhYX0xJTktfU1RBVEUsXG4gIFBIWF9MSVZFX0xJTkssXG4gIFBIWF9MVl9ERUJVRyxcbiAgUEhYX0xWX0xBVEVOQ1lfU0lNLFxuICBQSFhfTFZfUFJPRklMRSxcbiAgUEhYX01BSU4sXG4gIFBIWF9QQVJFTlRfSUQsXG4gIFBIWF9WSUVXX1NFTEVDVE9SLFxuICBQSFhfUk9PVF9JRCxcbiAgUEhYX1RIUk9UVExFLFxuICBQSFhfVFJBQ0tfVVBMT0FEUyxcbiAgUkVMT0FEX0pJVFRFUlxuXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCB7XG4gIGNsb25lLFxuICBjbG9zZXN0UGh4QmluZGluZyxcbiAgY2xvc3VyZSxcbiAgZGVidWcsXG4gIG1heWJlXG59IGZyb20gXCIuL3V0aWxzXCJcblxuaW1wb3J0IEJyb3dzZXIgZnJvbSBcIi4vYnJvd3NlclwiXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbVwiXG5pbXBvcnQgSG9va3MgZnJvbSBcIi4vaG9va3NcIlxuaW1wb3J0IExpdmVVcGxvYWRlciBmcm9tIFwiLi9saXZlX3VwbG9hZGVyXCJcbmltcG9ydCBWaWV3IGZyb20gXCIuL3ZpZXdcIlxuaW1wb3J0IHtQSFhfU0VTU0lPTn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGl2ZVNvY2tldCB7XG4gIGNvbnN0cnVjdG9yKHVybCwgcGh4U29ja2V0LCBvcHRzID0ge30pe1xuICAgIHRoaXMudW5sb2FkZWQgPSBmYWxzZVxuICAgIGlmKCFwaHhTb2NrZXQgfHwgcGh4U29ja2V0LmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiT2JqZWN0XCIpe1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBcbiAgICAgIGEgcGhvZW5peCBTb2NrZXQgbXVzdCBiZSBwcm92aWRlZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBMaXZlU29ja2V0IGNvbnN0cnVjdG9yLiBGb3IgZXhhbXBsZTpcblxuICAgICAgICAgIGltcG9ydCB7U29ja2V0fSBmcm9tIFwicGhvZW5peFwiXG4gICAgICAgICAgaW1wb3J0IExpdmVTb2NrZXQgZnJvbSBcInBob2VuaXhfbGl2ZV92aWV3XCJcbiAgICAgICAgICBsZXQgbGl2ZVNvY2tldCA9IG5ldyBMaXZlU29ja2V0KFwiL2xpdmVcIiwgU29ja2V0LCB7Li4ufSlcbiAgICAgIGApXG4gICAgfVxuICAgIHRoaXMuc29ja2V0ID0gbmV3IHBoeFNvY2tldCh1cmwsIG9wdHMpXG4gICAgdGhpcy5iaW5kaW5nUHJlZml4ID0gb3B0cy5iaW5kaW5nUHJlZml4IHx8IEJJTkRJTkdfUFJFRklYXG4gICAgdGhpcy5vcHRzID0gb3B0c1xuICAgIHRoaXMucGFyYW1zID0gY2xvc3VyZShvcHRzLnBhcmFtcyB8fCB7fSlcbiAgICB0aGlzLnZpZXdMb2dnZXIgPSBvcHRzLnZpZXdMb2dnZXJcbiAgICB0aGlzLm1ldGFkYXRhQ2FsbGJhY2tzID0gb3B0cy5tZXRhZGF0YSB8fCB7fVxuICAgIHRoaXMuZGVmYXVsdHMgPSBPYmplY3QuYXNzaWduKGNsb25lKERFRkFVTFRTKSwgb3B0cy5kZWZhdWx0cyB8fCB7fSlcbiAgICB0aGlzLmFjdGl2ZUVsZW1lbnQgPSBudWxsXG4gICAgdGhpcy5wcmV2QWN0aXZlID0gbnVsbFxuICAgIHRoaXMuc2lsZW5jZWQgPSBmYWxzZVxuICAgIHRoaXMubWFpbiA9IG51bGxcbiAgICB0aGlzLmxpbmtSZWYgPSAxXG4gICAgdGhpcy5yb290cyA9IHt9XG4gICAgdGhpcy5ocmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWZcbiAgICB0aGlzLnBlbmRpbmdMaW5rID0gbnVsbFxuICAgIHRoaXMuY3VycmVudExvY2F0aW9uID0gY2xvbmUod2luZG93LmxvY2F0aW9uKVxuICAgIHRoaXMuaG9va3MgPSBvcHRzLmhvb2tzIHx8IHt9XG4gICAgdGhpcy51cGxvYWRlcnMgPSBvcHRzLnVwbG9hZGVycyB8fCB7fVxuICAgIHRoaXMubG9hZGVyVGltZW91dCA9IG9wdHMubG9hZGVyVGltZW91dCB8fCBMT0FERVJfVElNRU9VVFxuICAgIHRoaXMubG9jYWxTdG9yYWdlID0gb3B0cy5sb2NhbFN0b3JhZ2UgfHwgd2luZG93LmxvY2FsU3RvcmFnZVxuICAgIHRoaXMuc2Vzc2lvblN0b3JhZ2UgPSBvcHRzLnNlc3Npb25TdG9yYWdlIHx8IHdpbmRvdy5zZXNzaW9uU3RvcmFnZVxuICAgIHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cyA9IGZhbHNlXG4gICAgdGhpcy5kb21DYWxsYmFja3MgPSBPYmplY3QuYXNzaWduKHtvbk5vZGVBZGRlZDogY2xvc3VyZSgpLCBvbkJlZm9yZUVsVXBkYXRlZDogY2xvc3VyZSgpfSwgb3B0cy5kb20gfHwge30pXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLCBfZSA9PiB7XG4gICAgICB0aGlzLnVubG9hZGVkID0gdHJ1ZVxuICAgIH0pXG4gICAgdGhpcy5zb2NrZXQub25PcGVuKCgpID0+IHtcbiAgICAgIGlmKHRoaXMuaXNVbmxvYWRlZCgpKXtcbiAgICAgICAgLy8gcmVsb2FkIHBhZ2UgaWYgYmVpbmcgcmVzdG9yZWQgZnJvbSBiYWNrL2ZvcndhcmQgY2FjaGUgYW5kIGJyb3dzZXIgZG9lcyBub3QgZW1pdCBcInBhZ2VzaG93XCJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vIHB1YmxpY1xuXG4gIGlzUHJvZmlsZUVuYWJsZWQoKXsgcmV0dXJuIHRoaXMuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShQSFhfTFZfUFJPRklMRSkgPT09IFwidHJ1ZVwiIH1cblxuICBpc0RlYnVnRW5hYmxlZCgpeyByZXR1cm4gdGhpcy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFBIWF9MVl9ERUJVRykgPT09IFwidHJ1ZVwiIH1cblxuICBlbmFibGVEZWJ1ZygpeyB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oUEhYX0xWX0RFQlVHLCBcInRydWVcIikgfVxuXG4gIGVuYWJsZVByb2ZpbGluZygpeyB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oUEhYX0xWX1BST0ZJTEUsIFwidHJ1ZVwiKSB9XG5cbiAgZGlzYWJsZURlYnVnKCl7IHRoaXMuc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShQSFhfTFZfREVCVUcpIH1cblxuICBkaXNhYmxlUHJvZmlsaW5nKCl7IHRoaXMuc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShQSFhfTFZfUFJPRklMRSkgfVxuXG4gIGVuYWJsZUxhdGVuY3lTaW0odXBwZXJCb3VuZE1zKXtcbiAgICB0aGlzLmVuYWJsZURlYnVnKClcbiAgICBjb25zb2xlLmxvZyhcImxhdGVuY3kgc2ltdWxhdG9yIGVuYWJsZWQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGlzIGJyb3dzZXIgc2Vzc2lvbi4gQ2FsbCBkaXNhYmxlTGF0ZW5jeVNpbSgpIHRvIGRpc2FibGVcIilcbiAgICB0aGlzLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oUEhYX0xWX0xBVEVOQ1lfU0lNLCB1cHBlckJvdW5kTXMpXG4gIH1cblxuICBkaXNhYmxlTGF0ZW5jeVNpbSgpeyB0aGlzLnNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oUEhYX0xWX0xBVEVOQ1lfU0lNKSB9XG5cbiAgZ2V0TGF0ZW5jeVNpbSgpe1xuICAgIGxldCBzdHIgPSB0aGlzLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oUEhYX0xWX0xBVEVOQ1lfU0lNKVxuICAgIHJldHVybiBzdHIgPyBwYXJzZUludChzdHIpIDogbnVsbFxuICB9XG5cbiAgZ2V0U29ja2V0KCl7IHJldHVybiB0aGlzLnNvY2tldCB9XG5cbiAgY29ubmVjdCgpe1xuICAgIGxldCBkb0Nvbm5lY3QgPSAoKSA9PiB7XG4gICAgICBpZih0aGlzLmpvaW5Sb290Vmlld3MoKSl7XG4gICAgICAgIHRoaXMuYmluZFRvcExldmVsRXZlbnRzKClcbiAgICAgICAgdGhpcy5zb2NrZXQuY29ubmVjdCgpXG4gICAgICB9XG4gICAgfVxuICAgIGlmKFtcImNvbXBsZXRlXCIsIFwibG9hZGVkXCIsIFwiaW50ZXJhY3RpdmVcIl0uaW5kZXhPZihkb2N1bWVudC5yZWFkeVN0YXRlKSA+PSAwKXtcbiAgICAgIGRvQ29ubmVjdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsICgpID0+IGRvQ29ubmVjdCgpKVxuICAgIH1cbiAgfVxuXG4gIGRpc2Nvbm5lY3QoY2FsbGJhY2speyB0aGlzLnNvY2tldC5kaXNjb25uZWN0KGNhbGxiYWNrKSB9XG5cbiAgLy8gcHJpdmF0ZVxuXG4gIHRyaWdnZXJET00oa2luZCwgYXJncyl7IHRoaXMuZG9tQ2FsbGJhY2tzW2tpbmRdKC4uLmFyZ3MpIH1cblxuICB0aW1lKG5hbWUsIGZ1bmMpe1xuICAgIGlmKCF0aGlzLmlzUHJvZmlsZUVuYWJsZWQoKSB8fCAhY29uc29sZS50aW1lKXsgcmV0dXJuIGZ1bmMoKSB9XG4gICAgY29uc29sZS50aW1lKG5hbWUpXG4gICAgbGV0IHJlc3VsdCA9IGZ1bmMoKVxuICAgIGNvbnNvbGUudGltZUVuZChuYW1lKVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGxvZyh2aWV3LCBraW5kLCBtc2dDYWxsYmFjayl7XG4gICAgaWYodGhpcy52aWV3TG9nZ2VyKXtcbiAgICAgIGxldCBbbXNnLCBvYmpdID0gbXNnQ2FsbGJhY2soKVxuICAgICAgdGhpcy52aWV3TG9nZ2VyKHZpZXcsIGtpbmQsIG1zZywgb2JqKVxuICAgIH0gZWxzZSBpZih0aGlzLmlzRGVidWdFbmFibGVkKCkpe1xuICAgICAgbGV0IFttc2csIG9ial0gPSBtc2dDYWxsYmFjaygpXG4gICAgICBkZWJ1Zyh2aWV3LCBraW5kLCBtc2csIG9iailcbiAgICB9XG4gIH1cblxuICBvbkNoYW5uZWwoY2hhbm5lbCwgZXZlbnQsIGNiKXtcbiAgICBjaGFubmVsLm9uKGV2ZW50LCBkYXRhID0+IHtcbiAgICAgIGxldCBsYXRlbmN5ID0gdGhpcy5nZXRMYXRlbmN5U2ltKClcbiAgICAgIGlmKCFsYXRlbmN5KXtcbiAgICAgICAgY2IoZGF0YSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBzaW11bGF0aW5nICR7bGF0ZW5jeX1tcyBvZiBsYXRlbmN5IGZyb20gc2VydmVyIHRvIGNsaWVudGApXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gY2IoZGF0YSksIGxhdGVuY3kpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHdyYXBQdXNoKHZpZXcsIG9wdHMsIHB1c2gpe1xuICAgIGxldCBsYXRlbmN5ID0gdGhpcy5nZXRMYXRlbmN5U2ltKClcbiAgICBsZXQgb2xkSm9pbkNvdW50ID0gdmlldy5qb2luQ291bnRcbiAgICBpZighbGF0ZW5jeSl7XG4gICAgICBpZihvcHRzLnRpbWVvdXQpe1xuICAgICAgICByZXR1cm4gcHVzaCgpLnJlY2VpdmUoXCJ0aW1lb3V0XCIsICgpID0+IHtcbiAgICAgICAgICBpZih2aWV3LmpvaW5Db3VudCA9PT0gb2xkSm9pbkNvdW50ICYmICF2aWV3LmlzRGVzdHJveWVkKCkpe1xuICAgICAgICAgICAgdGhpcy5yZWxvYWRXaXRoSml0dGVyKHZpZXcsICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5sb2codmlldywgXCJ0aW1lb3V0XCIsICgpID0+IFtcInJlY2VpdmVkIHRpbWVvdXQgd2hpbGUgY29tbXVuaWNhdGluZyB3aXRoIHNlcnZlci4gRmFsbGluZyBiYWNrIHRvIGhhcmQgcmVmcmVzaCBmb3IgcmVjb3ZlcnlcIl0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBwdXNoKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhgc2ltdWxhdGluZyAke2xhdGVuY3l9bXMgb2YgbGF0ZW5jeSBmcm9tIGNsaWVudCB0byBzZXJ2ZXJgKVxuICAgIGxldCBmYWtlUHVzaCA9IHtcbiAgICAgIHJlY2VpdmVzOiBbXSxcbiAgICAgIHJlY2VpdmUoa2luZCwgY2IpeyB0aGlzLnJlY2VpdmVzLnB1c2goW2tpbmQsIGNiXSkgfVxuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmKHZpZXcuaXNEZXN0cm95ZWQoKSl7IHJldHVybiB9XG4gICAgICBmYWtlUHVzaC5yZWNlaXZlcy5yZWR1Y2UoKGFjYywgW2tpbmQsIGNiXSkgPT4gYWNjLnJlY2VpdmUoa2luZCwgY2IpLCBwdXNoKCkpXG4gICAgfSwgbGF0ZW5jeSlcbiAgICByZXR1cm4gZmFrZVB1c2hcbiAgfVxuXG4gIHJlbG9hZFdpdGhKaXR0ZXIodmlldywgbG9nKXtcbiAgICB2aWV3LmRlc3Ryb3koKVxuICAgIHRoaXMuZGlzY29ubmVjdCgpXG4gICAgbGV0IFttaW5NcywgbWF4TXNdID0gUkVMT0FEX0pJVFRFUlxuICAgIGxldCBhZnRlck1zID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heE1zIC0gbWluTXMgKyAxKSkgKyBtaW5Nc1xuICAgIGxldCB0cmllcyA9IEJyb3dzZXIudXBkYXRlTG9jYWwodGhpcy5sb2NhbFN0b3JhZ2UsIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwgQ09OU0VDVVRJVkVfUkVMT0FEUywgMCwgY291bnQgPT4gY291bnQgKyAxKVxuICAgIGxvZyA/IGxvZygpIDogdGhpcy5sb2codmlldywgXCJqb2luXCIsICgpID0+IFtgZW5jb3VudGVyZWQgJHt0cmllc30gY29uc2VjdXRpdmUgcmVsb2Fkc2BdKVxuICAgIGlmKHRyaWVzID4gTUFYX1JFTE9BRFMpe1xuICAgICAgdGhpcy5sb2codmlldywgXCJqb2luXCIsICgpID0+IFtgZXhjZWVkZWQgJHtNQVhfUkVMT0FEU30gY29uc2VjdXRpdmUgcmVsb2Fkcy4gRW50ZXJpbmcgZmFpbHNhZmUgbW9kZWBdKVxuICAgICAgYWZ0ZXJNcyA9IEZBSUxTQUZFX0pJVFRFUlxuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmKHRoaXMuaGFzUGVuZGluZ0xpbmsoKSl7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHRoaXMucGVuZGluZ0xpbmtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgfVxuICAgIH0sIGFmdGVyTXMpXG4gIH1cblxuICBnZXRIb29rQ2FsbGJhY2tzKG5hbWUpe1xuICAgIHJldHVybiBuYW1lICYmIG5hbWUuc3RhcnRzV2l0aChcIlBob2VuaXguXCIpID8gSG9va3NbbmFtZS5zcGxpdChcIi5cIilbMV1dIDogdGhpcy5ob29rc1tuYW1lXVxuICB9XG5cbiAgaXNVbmxvYWRlZCgpeyByZXR1cm4gdGhpcy51bmxvYWRlZCB9XG5cbiAgaXNDb25uZWN0ZWQoKXsgcmV0dXJuIHRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkgfVxuXG4gIGdldEJpbmRpbmdQcmVmaXgoKXsgcmV0dXJuIHRoaXMuYmluZGluZ1ByZWZpeCB9XG5cbiAgYmluZGluZyhraW5kKXsgcmV0dXJuIGAke3RoaXMuZ2V0QmluZGluZ1ByZWZpeCgpfSR7a2luZH1gIH1cblxuICBjaGFubmVsKHRvcGljLCBwYXJhbXMpeyByZXR1cm4gdGhpcy5zb2NrZXQuY2hhbm5lbCh0b3BpYywgcGFyYW1zKSB9XG5cbiAgam9pblJvb3RWaWV3cygpe1xuICAgIGxldCByb290c0ZvdW5kID0gZmFsc2VcbiAgICBET00uYWxsKGRvY3VtZW50LCBgJHtQSFhfVklFV19TRUxFQ1RPUn06bm90KFske1BIWF9QQVJFTlRfSUR9XSlgLCByb290RWwgPT4ge1xuICAgICAgaWYoIXRoaXMuZ2V0Um9vdEJ5SWQocm9vdEVsLmlkKSl7XG4gICAgICAgIGxldCB2aWV3ID0gdGhpcy5uZXdSb290Vmlldyhyb290RWwpXG4gICAgICAgIHZpZXcuc2V0SHJlZih0aGlzLmdldEhyZWYoKSlcbiAgICAgICAgdmlldy5qb2luKClcbiAgICAgICAgaWYocm9vdEVsLmdldEF0dHJpYnV0ZShQSFhfTUFJTikpeyB0aGlzLm1haW4gPSB2aWV3IH1cbiAgICAgIH1cbiAgICAgIHJvb3RzRm91bmQgPSB0cnVlXG4gICAgfSlcbiAgICByZXR1cm4gcm9vdHNGb3VuZFxuICB9XG5cbiAgcmVkaXJlY3QodG8sIGZsYXNoKXtcbiAgICB0aGlzLmRpc2Nvbm5lY3QoKVxuICAgIEJyb3dzZXIucmVkaXJlY3QodG8sIGZsYXNoKVxuICB9XG5cbiAgcmVwbGFjZU1haW4oaHJlZiwgZmxhc2gsIGNhbGxiYWNrID0gbnVsbCwgbGlua1JlZiA9IHRoaXMuc2V0UGVuZGluZ0xpbmsoaHJlZikpe1xuICAgIGxldCBvbGRNYWluRWwgPSB0aGlzLm1haW4uZWxcbiAgICBsZXQgbmV3TWFpbkVsID0gRE9NLmNsb25lTm9kZShvbGRNYWluRWwsIFwiXCIpXG4gICAgdGhpcy5tYWluLnNob3dMb2FkZXIodGhpcy5sb2FkZXJUaW1lb3V0KVxuICAgIHRoaXMubWFpbi5kZXN0cm95KClcblxuICAgIHRoaXMubWFpbiA9IHRoaXMubmV3Um9vdFZpZXcobmV3TWFpbkVsLCBmbGFzaClcbiAgICB0aGlzLm1haW4uc2V0UmVkaXJlY3QoaHJlZilcbiAgICB0aGlzLm1haW4uam9pbihqb2luQ291bnQgPT4ge1xuICAgICAgaWYoam9pbkNvdW50ID09PSAxICYmIHRoaXMuY29tbWl0UGVuZGluZ0xpbmsobGlua1JlZikpe1xuICAgICAgICBvbGRNYWluRWwucmVwbGFjZVdpdGgobmV3TWFpbkVsKVxuICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGlzUGh4VmlldyhlbCl7IHJldHVybiBlbC5nZXRBdHRyaWJ1dGUgJiYgZWwuZ2V0QXR0cmlidXRlKFBIWF9TRVNTSU9OKSAhPT0gbnVsbCB9XG5cbiAgbmV3Um9vdFZpZXcoZWwsIGZsYXNoKXtcbiAgICBsZXQgdmlldyA9IG5ldyBWaWV3KGVsLCB0aGlzLCBudWxsLCBmbGFzaClcbiAgICB0aGlzLnJvb3RzW3ZpZXcuaWRdID0gdmlld1xuICAgIHJldHVybiB2aWV3XG4gIH1cblxuICBvd25lcihjaGlsZEVsLCBjYWxsYmFjayl7XG4gICAgbGV0IHZpZXcgPSBtYXliZShjaGlsZEVsLmNsb3Nlc3QoUEhYX1ZJRVdfU0VMRUNUT1IpLCBlbCA9PiB0aGlzLmdldFZpZXdCeUVsKGVsKSlcbiAgICBpZih2aWV3KXsgY2FsbGJhY2sodmlldykgfVxuICB9XG5cbiAgd2l0aGluT3duZXJzKGNoaWxkRWwsIGNhbGxiYWNrKXtcbiAgICB0aGlzLm93bmVyKGNoaWxkRWwsIHZpZXcgPT4ge1xuICAgICAgbGV0IHBoeFRhcmdldCA9IGNoaWxkRWwuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcInRhcmdldFwiKSlcbiAgICAgIGlmKHBoeFRhcmdldCA9PT0gbnVsbCl7XG4gICAgICAgIGNhbGxiYWNrKHZpZXcsIGNoaWxkRWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2aWV3LndpdGhpblRhcmdldHMocGh4VGFyZ2V0LCBjYWxsYmFjaylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZ2V0Vmlld0J5RWwoZWwpe1xuICAgIGxldCByb290SWQgPSBlbC5nZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQpXG4gICAgcmV0dXJuIG1heWJlKHRoaXMuZ2V0Um9vdEJ5SWQocm9vdElkKSwgcm9vdCA9PiByb290LmdldERlc2NlbmRlbnRCeUVsKGVsKSlcbiAgfVxuXG4gIGdldFJvb3RCeUlkKGlkKXsgcmV0dXJuIHRoaXMucm9vdHNbaWRdIH1cblxuICBkZXN0cm95QWxsVmlld3MoKXtcbiAgICBmb3IobGV0IGlkIGluIHRoaXMucm9vdHMpe1xuICAgICAgdGhpcy5yb290c1tpZF0uZGVzdHJveSgpXG4gICAgICBkZWxldGUgdGhpcy5yb290c1tpZF1cbiAgICB9XG4gIH1cblxuICBkZXN0cm95Vmlld0J5RWwoZWwpe1xuICAgIGxldCByb290ID0gdGhpcy5nZXRSb290QnlJZChlbC5nZXRBdHRyaWJ1dGUoUEhYX1JPT1RfSUQpKVxuICAgIGlmKHJvb3QpeyByb290LmRlc3Ryb3lEZXNjZW5kZW50KGVsLmlkKSB9XG4gIH1cblxuICBzZXRBY3RpdmVFbGVtZW50KHRhcmdldCl7XG4gICAgaWYodGhpcy5hY3RpdmVFbGVtZW50ID09PSB0YXJnZXQpeyByZXR1cm4gfVxuICAgIHRoaXMuYWN0aXZlRWxlbWVudCA9IHRhcmdldFxuICAgIGxldCBjYW5jZWwgPSAoKSA9PiB7XG4gICAgICBpZih0YXJnZXQgPT09IHRoaXMuYWN0aXZlRWxlbWVudCl7IHRoaXMuYWN0aXZlRWxlbWVudCA9IG51bGwgfVxuICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMpXG4gICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIHRoaXMpXG4gICAgfVxuICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBjYW5jZWwpXG4gICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLCBjYW5jZWwpXG4gIH1cblxuICBnZXRBY3RpdmVFbGVtZW50KCl7XG4gICAgaWYoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZG9jdW1lbnQuYm9keSl7XG4gICAgICByZXR1cm4gdGhpcy5hY3RpdmVFbGVtZW50IHx8IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBjYW4gYmUgbnVsbCBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMVxuICAgICAgcmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keVxuICAgIH1cbiAgfVxuXG4gIGRyb3BBY3RpdmVFbGVtZW50KHZpZXcpe1xuICAgIGlmKHRoaXMucHJldkFjdGl2ZSAmJiB2aWV3Lm93bnNFbGVtZW50KHRoaXMucHJldkFjdGl2ZSkpe1xuICAgICAgdGhpcy5wcmV2QWN0aXZlID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHJlc3RvcmVQcmV2aW91c2x5QWN0aXZlRm9jdXMoKXtcbiAgICBpZih0aGlzLnByZXZBY3RpdmUgJiYgdGhpcy5wcmV2QWN0aXZlICE9PSBkb2N1bWVudC5ib2R5KXtcbiAgICAgIHRoaXMucHJldkFjdGl2ZS5mb2N1cygpXG4gICAgfVxuICB9XG5cbiAgYmx1ckFjdGl2ZUVsZW1lbnQoKXtcbiAgICB0aGlzLnByZXZBY3RpdmUgPSB0aGlzLmdldEFjdGl2ZUVsZW1lbnQoKVxuICAgIGlmKHRoaXMucHJldkFjdGl2ZSAhPT0gZG9jdW1lbnQuYm9keSl7IHRoaXMucHJldkFjdGl2ZS5ibHVyKCkgfVxuICB9XG5cbiAgYmluZFRvcExldmVsRXZlbnRzKCl7XG4gICAgaWYodGhpcy5ib3VuZFRvcExldmVsRXZlbnRzKXsgcmV0dXJuIH1cblxuICAgIHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cyA9IHRydWVcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoKXsgfSkgLy8gZW5zdXJlIGFsbCBjbGljayBldmVudHMgYnViYmxlIGZvciBtb2JpbGUgU2FmYXJpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlc2hvd1wiLCBlID0+IHtcbiAgICAgIGlmKGUucGVyc2lzdGVkKXsgLy8gcmVsb2FkIHBhZ2UgaWYgYmVpbmcgcmVzdG9yZWQgZnJvbSBiYWNrL2ZvcndhcmQgY2FjaGVcbiAgICAgICAgdGhpcy5nZXRTb2NrZXQoKS5kaXNjb25uZWN0KClcbiAgICAgICAgdGhpcy53aXRoUGFnZUxvYWRpbmcoe3RvOiB3aW5kb3cubG9jYXRpb24uaHJlZiwga2luZDogXCJyZWRpcmVjdFwifSlcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICB9XG4gICAgfSwgdHJ1ZSlcbiAgICB0aGlzLmJpbmROYXYoKVxuICAgIHRoaXMuYmluZENsaWNrcygpXG4gICAgdGhpcy5iaW5kRm9ybXMoKVxuICAgIHRoaXMuYmluZCh7a2V5dXA6IFwia2V5dXBcIiwga2V5ZG93bjogXCJrZXlkb3duXCJ9LCAoZSwgdHlwZSwgdmlldywgdGFyZ2V0LCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBfcGh4VGFyZ2V0KSA9PiB7XG4gICAgICBsZXQgbWF0Y2hLZXkgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfS0VZKSlcbiAgICAgIGxldCBwcmVzc2VkS2V5ID0gZS5rZXkgJiYgZS5rZXkudG9Mb3dlckNhc2UoKSAvLyBjaHJvbWUgY2xpY2tlZCBhdXRvY29tcGxldGVzIHNlbmQgYSBrZXlkb3duIHdpdGhvdXQga2V5XG4gICAgICBpZihtYXRjaEtleSAmJiBtYXRjaEtleS50b0xvd2VyQ2FzZSgpICE9PSBwcmVzc2VkS2V5KXsgcmV0dXJuIH1cblxuICAgICAgdmlldy5wdXNoS2V5KHRhcmdldCwgdGFyZ2V0Q3R4LCB0eXBlLCBwaHhFdmVudCwge2tleTogZS5rZXksIC4uLnRoaXMuZXZlbnRNZXRhKHR5cGUsIGUsIHRhcmdldCl9KVxuICAgIH0pXG4gICAgdGhpcy5iaW5kKHtibHVyOiBcImZvY3Vzb3V0XCIsIGZvY3VzOiBcImZvY3VzaW5cIn0sIChlLCB0eXBlLCB2aWV3LCB0YXJnZXRFbCwgdGFyZ2V0Q3R4LCBwaHhFdmVudCwgcGh4VGFyZ2V0KSA9PiB7XG4gICAgICBpZighcGh4VGFyZ2V0KXtcbiAgICAgICAgdmlldy5wdXNoRXZlbnQodHlwZSwgdGFyZ2V0RWwsIHRhcmdldEN0eCwgcGh4RXZlbnQsIHRoaXMuZXZlbnRNZXRhKHR5cGUsIGUsIHRhcmdldEVsKSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHRoaXMuYmluZCh7Ymx1cjogXCJibHVyXCIsIGZvY3VzOiBcImZvY3VzXCJ9LCAoZSwgdHlwZSwgdmlldywgdGFyZ2V0RWwsIHRhcmdldEN0eCwgcGh4RXZlbnQsIHBoeFRhcmdldCkgPT4ge1xuICAgICAgLy8gYmx1ciBhbmQgZm9jdXMgYXJlIHRyaWdnZXJlZCBvbiBkb2N1bWVudCBhbmQgd2luZG93LiBEaXNjYXJkIG9uZSB0byBhdm9pZCBkdXBzXG4gICAgICBpZihwaHhUYXJnZXQgJiYgIXBoeFRhcmdldCAhPT0gXCJ3aW5kb3dcIil7XG4gICAgICAgIHZpZXcucHVzaEV2ZW50KHR5cGUsIHRhcmdldEVsLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCB0aGlzLmV2ZW50TWV0YSh0eXBlLCBlLCB0YXJnZXRFbCkpXG4gICAgICB9XG4gICAgfSlcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImRyYWdvdmVyXCIsIGUgPT4gZS5wcmV2ZW50RGVmYXVsdCgpKVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiZHJvcFwiLCBlID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgbGV0IGRyb3BUYXJnZXRJZCA9IG1heWJlKGNsb3Nlc3RQaHhCaW5kaW5nKGUudGFyZ2V0LCB0aGlzLmJpbmRpbmcoUEhYX0RST1BfVEFSR0VUKSksIHRydWVUYXJnZXQgPT4ge1xuICAgICAgICByZXR1cm4gdHJ1ZVRhcmdldC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9EUk9QX1RBUkdFVCkpXG4gICAgICB9KVxuICAgICAgbGV0IGRyb3BUYXJnZXQgPSBkcm9wVGFyZ2V0SWQgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZHJvcFRhcmdldElkKVxuICAgICAgbGV0IGZpbGVzID0gQXJyYXkuZnJvbShlLmRhdGFUcmFuc2Zlci5maWxlcyB8fCBbXSlcbiAgICAgIGlmKCFkcm9wVGFyZ2V0IHx8IGRyb3BUYXJnZXQuZGlzYWJsZWQgfHwgZmlsZXMubGVuZ3RoID09PSAwIHx8ICEoZHJvcFRhcmdldC5maWxlcyBpbnN0YW5jZW9mIEZpbGVMaXN0KSl7IHJldHVybiB9XG5cbiAgICAgIExpdmVVcGxvYWRlci50cmFja0ZpbGVzKGRyb3BUYXJnZXQsIGZpbGVzKVxuICAgICAgZHJvcFRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIsIHtidWJibGVzOiB0cnVlfSkpXG4gICAgfSlcbiAgICB0aGlzLm9uKFBIWF9UUkFDS19VUExPQURTLCBlID0+IHtcbiAgICAgIGxldCB1cGxvYWRUYXJnZXQgPSBlLnRhcmdldFxuICAgICAgaWYoIURPTS5pc1VwbG9hZElucHV0KHVwbG9hZFRhcmdldCkpeyByZXR1cm4gfVxuICAgICAgbGV0IGZpbGVzID0gQXJyYXkuZnJvbShlLmRldGFpbC5maWxlcyB8fCBbXSkuZmlsdGVyKGYgPT4gZiBpbnN0YW5jZW9mIEZpbGUgfHwgZiBpbnN0YW5jZW9mIEJsb2IpXG4gICAgICBMaXZlVXBsb2FkZXIudHJhY2tGaWxlcyh1cGxvYWRUYXJnZXQsIGZpbGVzKVxuICAgICAgdXBsb2FkVGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiaW5wdXRcIiwge2J1YmJsZXM6IHRydWV9KSlcbiAgICB9KVxuICB9XG5cbiAgZXZlbnRNZXRhKGV2ZW50TmFtZSwgZSwgdGFyZ2V0RWwpe1xuICAgIGxldCBjYWxsYmFjayA9IHRoaXMubWV0YWRhdGFDYWxsYmFja3NbZXZlbnROYW1lXVxuICAgIHJldHVybiBjYWxsYmFjayA/IGNhbGxiYWNrKGUsIHRhcmdldEVsKSA6IHt9XG4gIH1cblxuICBzZXRQZW5kaW5nTGluayhocmVmKXtcbiAgICB0aGlzLmxpbmtSZWYrK1xuICAgIHRoaXMucGVuZGluZ0xpbmsgPSBocmVmXG4gICAgcmV0dXJuIHRoaXMubGlua1JlZlxuICB9XG5cbiAgY29tbWl0UGVuZGluZ0xpbmsobGlua1JlZil7XG4gICAgaWYodGhpcy5saW5rUmVmICE9PSBsaW5rUmVmKXtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhyZWYgPSB0aGlzLnBlbmRpbmdMaW5rXG4gICAgICB0aGlzLnBlbmRpbmdMaW5rID0gbnVsbFxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICBnZXRIcmVmKCl7IHJldHVybiB0aGlzLmhyZWYgfVxuXG4gIGhhc1BlbmRpbmdMaW5rKCl7IHJldHVybiAhIXRoaXMucGVuZGluZ0xpbmsgfVxuXG4gIGJpbmQoZXZlbnRzLCBjYWxsYmFjayl7XG4gICAgZm9yKGxldCBldmVudCBpbiBldmVudHMpe1xuICAgICAgbGV0IGJyb3dzZXJFdmVudE5hbWUgPSBldmVudHNbZXZlbnRdXG5cbiAgICAgIHRoaXMub24oYnJvd3NlckV2ZW50TmFtZSwgZSA9PiB7XG4gICAgICAgIGxldCBiaW5kaW5nID0gdGhpcy5iaW5kaW5nKGV2ZW50KVxuICAgICAgICBsZXQgd2luZG93QmluZGluZyA9IHRoaXMuYmluZGluZyhgd2luZG93LSR7ZXZlbnR9YClcbiAgICAgICAgbGV0IHRhcmdldFBoeEV2ZW50ID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlICYmIGUudGFyZ2V0LmdldEF0dHJpYnV0ZShiaW5kaW5nKVxuICAgICAgICBpZih0YXJnZXRQaHhFdmVudCl7XG4gICAgICAgICAgdGhpcy5kZWJvdW5jZShlLnRhcmdldCwgZSwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy53aXRoaW5Pd25lcnMoZS50YXJnZXQsICh2aWV3LCB0YXJnZXRDdHgpID0+IHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soZSwgZXZlbnQsIHZpZXcsIGUudGFyZ2V0LCB0YXJnZXRDdHgsIHRhcmdldFBoeEV2ZW50LCBudWxsKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIERPTS5hbGwoZG9jdW1lbnQsIGBbJHt3aW5kb3dCaW5kaW5nfV1gLCBlbCA9PiB7XG4gICAgICAgICAgICBsZXQgcGh4RXZlbnQgPSBlbC5nZXRBdHRyaWJ1dGUod2luZG93QmluZGluZylcbiAgICAgICAgICAgIHRoaXMuZGVib3VuY2UoZWwsIGUsICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy53aXRoaW5Pd25lcnMoZWwsICh2aWV3LCB0YXJnZXRDdHgpID0+IHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlLCBldmVudCwgdmlldywgZWwsIHRhcmdldEN0eCwgcGh4RXZlbnQsIFwid2luZG93XCIpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgYmluZENsaWNrcygpe1xuICAgIHRoaXMuYmluZENsaWNrKFwiY2xpY2tcIiwgXCJjbGlja1wiLCBmYWxzZSlcbiAgICB0aGlzLmJpbmRDbGljayhcIm1vdXNlZG93blwiLCBcImNhcHR1cmUtY2xpY2tcIiwgdHJ1ZSlcbiAgfVxuXG4gIGJpbmRDbGljayhldmVudE5hbWUsIGJpbmRpbmdOYW1lLCBjYXB0dXJlKXtcbiAgICBsZXQgY2xpY2sgPSB0aGlzLmJpbmRpbmcoYmluZGluZ05hbWUpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBlID0+IHtcbiAgICAgIGlmKCF0aGlzLmlzQ29ubmVjdGVkKCkpeyByZXR1cm4gfVxuICAgICAgbGV0IHRhcmdldCA9IG51bGxcbiAgICAgIGlmKGNhcHR1cmUpe1xuICAgICAgICB0YXJnZXQgPSBlLnRhcmdldC5tYXRjaGVzKGBbJHtjbGlja31dYCkgPyBlLnRhcmdldCA6IGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoYFske2NsaWNrfV1gKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0ID0gY2xvc2VzdFBoeEJpbmRpbmcoZS50YXJnZXQsIGNsaWNrKVxuICAgICAgfVxuICAgICAgbGV0IHBoeEV2ZW50ID0gdGFyZ2V0ICYmIHRhcmdldC5nZXRBdHRyaWJ1dGUoY2xpY2spXG4gICAgICBpZighcGh4RXZlbnQpeyByZXR1cm4gfVxuICAgICAgaWYodGFyZ2V0LmdldEF0dHJpYnV0ZShcImhyZWZcIikgPT09IFwiI1wiKXsgZS5wcmV2ZW50RGVmYXVsdCgpIH1cblxuICAgICAgdGhpcy5kZWJvdW5jZSh0YXJnZXQsIGUsICgpID0+IHtcbiAgICAgICAgdGhpcy53aXRoaW5Pd25lcnModGFyZ2V0LCAodmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICAgICAgdmlldy5wdXNoRXZlbnQoXCJjbGlja1wiLCB0YXJnZXQsIHRhcmdldEN0eCwgcGh4RXZlbnQsIHRoaXMuZXZlbnRNZXRhKFwiY2xpY2tcIiwgZSwgdGFyZ2V0KSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSwgY2FwdHVyZSlcbiAgfVxuXG4gIGJpbmROYXYoKXtcbiAgICBpZighQnJvd3Nlci5jYW5QdXNoU3RhdGUoKSl7IHJldHVybiB9XG4gICAgaWYoaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbil7IGhpc3Rvcnkuc2Nyb2xsUmVzdG9yYXRpb24gPSBcIm1hbnVhbFwiIH1cbiAgICBsZXQgc2Nyb2xsVGltZXIgPSBudWxsXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgX2UgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHNjcm9sbFRpbWVyKVxuICAgICAgc2Nyb2xsVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgQnJvd3Nlci51cGRhdGVDdXJyZW50U3RhdGUoc3RhdGUgPT4gT2JqZWN0LmFzc2lnbihzdGF0ZSwge3Njcm9sbDogd2luZG93LnNjcm9sbFl9KSlcbiAgICAgIH0sIDEwMClcbiAgICB9KVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9wc3RhdGVcIiwgZXZlbnQgPT4ge1xuICAgICAgaWYoIXRoaXMucmVnaXN0ZXJOZXdMb2NhdGlvbih3aW5kb3cubG9jYXRpb24pKXsgcmV0dXJuIH1cbiAgICAgIGxldCB7dHlwZSwgaWQsIHJvb3QsIHNjcm9sbH0gPSBldmVudC5zdGF0ZSB8fCB7fVxuICAgICAgbGV0IGhyZWYgPSB3aW5kb3cubG9jYXRpb24uaHJlZlxuXG4gICAgICBpZih0aGlzLm1haW4uaXNDb25uZWN0ZWQoKSAmJiAodHlwZSA9PT0gXCJwYXRjaFwiICYmIGlkID09PSB0aGlzLm1haW4uaWQpKXtcbiAgICAgICAgdGhpcy5tYWluLnB1c2hMaW5rUGF0Y2goaHJlZiwgbnVsbClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVwbGFjZU1haW4oaHJlZiwgbnVsbCwgKCkgPT4ge1xuICAgICAgICAgIGlmKHJvb3QpeyB0aGlzLnJlcGxhY2VSb290SGlzdG9yeSgpIH1cbiAgICAgICAgICBpZih0eXBlb2YgKHNjcm9sbCkgPT09IFwibnVtYmVyXCIpe1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBzY3JvbGwpXG4gICAgICAgICAgICB9LCAwKSAvLyB0aGUgYm9keSBuZWVkcyB0byByZW5kZXIgYmVmb3JlIHdlIHNjcm9sbC5cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSwgZmFsc2UpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBlID0+IHtcbiAgICAgIGxldCB0YXJnZXQgPSBjbG9zZXN0UGh4QmluZGluZyhlLnRhcmdldCwgUEhYX0xJVkVfTElOSylcbiAgICAgIGxldCB0eXBlID0gdGFyZ2V0ICYmIHRhcmdldC5nZXRBdHRyaWJ1dGUoUEhYX0xJVkVfTElOSylcbiAgICAgIGxldCB3YW50c05ld1RhYiA9IGUubWV0YUtleSB8fCBlLmN0cmxLZXkgfHwgZS5idXR0b24gPT09IDFcbiAgICAgIGlmKCF0eXBlIHx8ICF0aGlzLmlzQ29ubmVjdGVkKCkgfHwgIXRoaXMubWFpbiB8fCB3YW50c05ld1RhYil7IHJldHVybiB9XG4gICAgICBsZXQgaHJlZiA9IHRhcmdldC5ocmVmXG4gICAgICBsZXQgbGlua1N0YXRlID0gdGFyZ2V0LmdldEF0dHJpYnV0ZShQSFhfTElOS19TVEFURSlcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgaWYodGhpcy5wZW5kaW5nTGluayA9PT0gaHJlZil7IHJldHVybiB9XG5cbiAgICAgIGlmKHR5cGUgPT09IFwicGF0Y2hcIil7XG4gICAgICAgIHRoaXMucHVzaEhpc3RvcnlQYXRjaChocmVmLCBsaW5rU3RhdGUsIHRhcmdldClcbiAgICAgIH0gZWxzZSBpZih0eXBlID09PSBcInJlZGlyZWN0XCIpe1xuICAgICAgICB0aGlzLmhpc3RvcnlSZWRpcmVjdChocmVmLCBsaW5rU3RhdGUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGV4cGVjdGVkICR7UEhYX0xJVkVfTElOS30gdG8gYmUgXCJwYXRjaFwiIG9yIFwicmVkaXJlY3RcIiwgZ290OiAke3R5cGV9YClcbiAgICAgIH1cbiAgICB9LCBmYWxzZSlcbiAgfVxuXG4gIHdpdGhQYWdlTG9hZGluZyhpbmZvLCBjYWxsYmFjayl7XG4gICAgRE9NLmRpc3BhdGNoRXZlbnQod2luZG93LCBcInBoeDpwYWdlLWxvYWRpbmctc3RhcnRcIiwgaW5mbylcbiAgICBsZXQgZG9uZSA9ICgpID0+IERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgXCJwaHg6cGFnZS1sb2FkaW5nLXN0b3BcIiwgaW5mbylcbiAgICByZXR1cm4gY2FsbGJhY2sgPyBjYWxsYmFjayhkb25lKSA6IGRvbmVcbiAgfVxuXG4gIHB1c2hIaXN0b3J5UGF0Y2goaHJlZiwgbGlua1N0YXRlLCB0YXJnZXRFbCl7XG4gICAgdGhpcy53aXRoUGFnZUxvYWRpbmcoe3RvOiBocmVmLCBraW5kOiBcInBhdGNoXCJ9LCBkb25lID0+IHtcbiAgICAgIHRoaXMubWFpbi5wdXNoTGlua1BhdGNoKGhyZWYsIHRhcmdldEVsLCBsaW5rUmVmID0+IHtcbiAgICAgICAgdGhpcy5oaXN0b3J5UGF0Y2goaHJlZiwgbGlua1N0YXRlLCBsaW5rUmVmKVxuICAgICAgICBkb25lKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIGhpc3RvcnlQYXRjaChocmVmLCBsaW5rU3RhdGUsIGxpbmtSZWYgPSB0aGlzLnNldFBlbmRpbmdMaW5rKGhyZWYpKXtcbiAgICBpZighdGhpcy5jb21taXRQZW5kaW5nTGluayhsaW5rUmVmKSl7IHJldHVybiB9XG5cbiAgICBCcm93c2VyLnB1c2hTdGF0ZShsaW5rU3RhdGUsIHt0eXBlOiBcInBhdGNoXCIsIGlkOiB0aGlzLm1haW4uaWR9LCBocmVmKVxuICAgIHRoaXMucmVnaXN0ZXJOZXdMb2NhdGlvbih3aW5kb3cubG9jYXRpb24pXG4gIH1cblxuICBoaXN0b3J5UmVkaXJlY3QoaHJlZiwgbGlua1N0YXRlLCBmbGFzaCl7XG4gICAgbGV0IHNjcm9sbCA9IHdpbmRvdy5zY3JvbGxZXG4gICAgdGhpcy53aXRoUGFnZUxvYWRpbmcoe3RvOiBocmVmLCBraW5kOiBcInJlZGlyZWN0XCJ9LCBkb25lID0+IHtcbiAgICAgIHRoaXMucmVwbGFjZU1haW4oaHJlZiwgZmxhc2gsICgpID0+IHtcbiAgICAgICAgQnJvd3Nlci5wdXNoU3RhdGUobGlua1N0YXRlLCB7dHlwZTogXCJyZWRpcmVjdFwiLCBpZDogdGhpcy5tYWluLmlkLCBzY3JvbGw6IHNjcm9sbH0sIGhyZWYpXG4gICAgICAgIHRoaXMucmVnaXN0ZXJOZXdMb2NhdGlvbih3aW5kb3cubG9jYXRpb24pXG4gICAgICAgIGRvbmUoKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgcmVwbGFjZVJvb3RIaXN0b3J5KCl7XG4gICAgQnJvd3Nlci5wdXNoU3RhdGUoXCJyZXBsYWNlXCIsIHtyb290OiB0cnVlLCB0eXBlOiBcInBhdGNoXCIsIGlkOiB0aGlzLm1haW4uaWR9KVxuICB9XG5cbiAgcmVnaXN0ZXJOZXdMb2NhdGlvbihuZXdMb2NhdGlvbil7XG4gICAgbGV0IHtwYXRobmFtZSwgc2VhcmNofSA9IHRoaXMuY3VycmVudExvY2F0aW9uXG4gICAgaWYocGF0aG5hbWUgKyBzZWFyY2ggPT09IG5ld0xvY2F0aW9uLnBhdGhuYW1lICsgbmV3TG9jYXRpb24uc2VhcmNoKXtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJlbnRMb2NhdGlvbiA9IGNsb25lKG5ld0xvY2F0aW9uKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICBiaW5kRm9ybXMoKXtcbiAgICBsZXQgaXRlcmF0aW9ucyA9IDBcbiAgICB0aGlzLm9uKFwic3VibWl0XCIsIGUgPT4ge1xuICAgICAgbGV0IHBoeEV2ZW50ID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcInN1Ym1pdFwiKSlcbiAgICAgIGlmKCFwaHhFdmVudCl7IHJldHVybiB9XG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIGUudGFyZ2V0LmRpc2FibGVkID0gdHJ1ZVxuICAgICAgdGhpcy53aXRoaW5Pd25lcnMoZS50YXJnZXQsICh2aWV3LCB0YXJnZXRDdHgpID0+IHZpZXcuc3VibWl0Rm9ybShlLnRhcmdldCwgdGFyZ2V0Q3R4LCBwaHhFdmVudCkpXG4gICAgfSwgZmFsc2UpXG5cbiAgICBmb3IobGV0IHR5cGUgb2YgW1wiY2hhbmdlXCIsIFwiaW5wdXRcIl0pe1xuICAgICAgdGhpcy5vbih0eXBlLCBlID0+IHtcbiAgICAgICAgbGV0IGlucHV0ID0gZS50YXJnZXRcbiAgICAgICAgbGV0IHBoeEV2ZW50ID0gaW5wdXQuZm9ybSAmJiBpbnB1dC5mb3JtLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJjaGFuZ2VcIikpXG4gICAgICAgIGlmKCFwaHhFdmVudCl7IHJldHVybiB9XG4gICAgICAgIGlmKGlucHV0LnR5cGUgPT09IFwibnVtYmVyXCIgJiYgaW5wdXQudmFsaWRpdHkgJiYgaW5wdXQudmFsaWRpdHkuYmFkSW5wdXQpeyByZXR1cm4gfVxuICAgICAgICBsZXQgY3VycmVudEl0ZXJhdGlvbnMgPSBpdGVyYXRpb25zXG4gICAgICAgIGl0ZXJhdGlvbnMrK1xuICAgICAgICBsZXQge2F0OiBhdCwgdHlwZTogbGFzdFR5cGV9ID0gRE9NLnByaXZhdGUoaW5wdXQsIFwicHJldi1pdGVyYXRpb25cIikgfHwge31cbiAgICAgICAgLy8gZGV0ZWN0IGR1cCBiZWNhdXNlIHNvbWUgYnJvd3NlcnMgZGlzcGF0Y2ggYm90aCBcImlucHV0XCIgYW5kIFwiY2hhbmdlXCJcbiAgICAgICAgaWYoYXQgPT09IGN1cnJlbnRJdGVyYXRpb25zIC0gMSAmJiB0eXBlICE9PSBsYXN0VHlwZSl7IHJldHVybiB9XG5cbiAgICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXQsIFwicHJldi1pdGVyYXRpb25cIiwge2F0OiBjdXJyZW50SXRlcmF0aW9ucywgdHlwZTogdHlwZX0pXG5cbiAgICAgICAgdGhpcy5kZWJvdW5jZShpbnB1dCwgZSwgKCkgPT4ge1xuICAgICAgICAgIHRoaXMud2l0aGluT3duZXJzKGlucHV0LmZvcm0sICh2aWV3LCB0YXJnZXRDdHgpID0+IHtcbiAgICAgICAgICAgIERPTS5wdXRQcml2YXRlKGlucHV0LCBQSFhfSEFTX0ZPQ1VTRUQsIHRydWUpXG4gICAgICAgICAgICBpZighRE9NLmlzVGV4dHVhbElucHV0KGlucHV0KSl7XG4gICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlRWxlbWVudChpbnB1dClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZpZXcucHVzaElucHV0KGlucHV0LCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBlLnRhcmdldClcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSwgZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgZGVib3VuY2UoZWwsIGV2ZW50LCBjYWxsYmFjayl7XG4gICAgbGV0IHBoeERlYm91bmNlID0gdGhpcy5iaW5kaW5nKFBIWF9ERUJPVU5DRSlcbiAgICBsZXQgcGh4VGhyb3R0bGUgPSB0aGlzLmJpbmRpbmcoUEhYX1RIUk9UVExFKVxuICAgIGxldCBkZWZhdWx0RGVib3VuY2UgPSB0aGlzLmRlZmF1bHRzLmRlYm91bmNlLnRvU3RyaW5nKClcbiAgICBsZXQgZGVmYXVsdFRocm90dGxlID0gdGhpcy5kZWZhdWx0cy50aHJvdHRsZS50b1N0cmluZygpXG4gICAgRE9NLmRlYm91bmNlKGVsLCBldmVudCwgcGh4RGVib3VuY2UsIGRlZmF1bHREZWJvdW5jZSwgcGh4VGhyb3R0bGUsIGRlZmF1bHRUaHJvdHRsZSwgY2FsbGJhY2spXG4gIH1cblxuICBzaWxlbmNlRXZlbnRzKGNhbGxiYWNrKXtcbiAgICB0aGlzLnNpbGVuY2VkID0gdHJ1ZVxuICAgIGNhbGxiYWNrKClcbiAgICB0aGlzLnNpbGVuY2VkID0gZmFsc2VcbiAgfVxuXG4gIG9uKGV2ZW50LCBjYWxsYmFjayl7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGUgPT4ge1xuICAgICAgaWYoIXRoaXMuc2lsZW5jZWQpeyBjYWxsYmFjayhlKSB9XG4gICAgfSlcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIFR1cmJvIGZyb20gXCJAaG90d2lyZWQvdHVyYm9cIlxuaW1wb3J0IHsgQXBwbGljYXRpb24gfSBmcm9tIFwic3RpbXVsdXNcIlxuaW1wb3J0IHsgZGVmaW5pdGlvbnMgfSBmcm9tICdzdGltdWx1czouL2NvbnRyb2xsZXJzJztcbmltcG9ydCB7U29ja2V0fSBmcm9tIFwicGhvZW5peFwiXG5pbXBvcnQge0xpdmVTb2NrZXR9IGZyb20gXCJwaG9lbml4X2xpdmVfdmlld1wiXG5pbXBvcnQgeyBEYXRlVGltZSB9IGZyb20gXCJsdXhvblwiO1xuXG5jb25zdCBhcHAgPSBBcHBsaWNhdGlvbi5zdGFydCgpO1xuYXBwLmxvYWQoZGVmaW5pdGlvbnMpO1xuXG5sZXQgSG9va3MgPSB7fVxuXG5Ib29rcy5BdXRvRm9jdXMgPSB7XG4gIG1vdW50ZWQoKSB7XG4gICAgdGhpcy5lbC5mb2N1cygpO1xuICB9XG59XG5cbkhvb2tzLk5haXZlRGF0ZVRpbWVVVEMgPSB7XG4gIG1vdW50ZWQoKSB7XG4gICAgICB2YXIgaW50bCA9IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKTtcbiAgICAgIHZhciB0eiA9IGRvY3VtZW50LmJvZHkuZGF0YXNldC50eiB8fCBpbnRsLnRpbWVab25lIHx8IFwiVVRDXCI7XG4gICAgICB2YXIgbG9jYWxlID0gZG9jdW1lbnQuYm9keS5kYXRhc2V0LmxvY2FsZSB8fCBpbnRsLmxvY2FsZSB8fCBcImVuXCI7XG5cbiAgICAgIHZhciBzdHlsZSA9IERhdGVUaW1lW3RoaXMuZWwuZGF0YXNldC50aW1lRm9ybWF0XTtcbiAgICAgIHZhciBkYXRlID0gRGF0ZVRpbWUuZnJvbUlTTyh0aGlzLmVsLmRhdGVUaW1lLCB7IHpvbmU6ICd1dGMnIH0pLnNldFpvbmUodHopLnNldExvY2FsZShsb2NhbGUpO1xuICAgICAgdGhpcy5lbC5pbm5lclRleHQgPSBkYXRlLnRvTG9jYWxlU3RyaW5nKHN0eWxlKTtcbiAgfVxufVxuXG5sZXQgY3NyZlRva2VuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT0nY3NyZi10b2tlbiddXCIpLmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIilcbmxldCBsaXZlU29ja2V0ID0gbmV3IExpdmVTb2NrZXQoXCIvbGl2ZVwiLCBTb2NrZXQsIHtob29rczogSG9va3MsIHBhcmFtczoge19jc3JmX3Rva2VuOiBjc3JmVG9rZW59fSlcblxuLy8gQ29ubmVjdCBpZiB0aGVyZSBhcmUgYW55IExpdmVWaWV3cyBvbiB0aGUgcGFnZVxubGl2ZVNvY2tldC5jb25uZWN0KClcblxuIl0sCiAgIm1hcHBpbmdzIjogIjt3RkFLTSxJQUFB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QUVuQyxJQUNILE1BQU8sR0FBUSxPQUNaLEtBQ0gsTUFBTyxHQUFRLEVBQVcsUUFDdkIsT0FDSCxNQUFPLEdBQVEsT0FDWixRQUNILE1BQU8sR0FBUSxPQUNaLFNBQ0gsTUFBTyxHQUFRLE9BRVosSUFDSCxNQUFPLEdBQVEsT0FDWixLQUNILE1BQU8sR0FBUSxPQUNaLE1BQ0gsTUFBTyxJQUFNLEVBQUksT0FBTyxRQUFTLEdBQU0sSUFBUSxPQUM1QyxPQUNILE1BQU8sSUFBTSxFQUFJLE9BQU8sT0FBUSxHQUFNLElBQVEsT0FDM0MsSUFDSCxNQUFPLEdBQVEsT0FDWixLQUNILE1BQU8sR0FBUSxPQUNaLE1BQ0gsTUFBTyxJQUFNLEVBQUksT0FBTyxRQUFTLEdBQU8sSUFBUSxPQUM3QyxPQUNILE1BQU8sSUFBTSxFQUFJLE9BQU8sT0FBUSxHQUFPLElBQVEsT0FFNUMsSUFDSCxNQUFPLEdBQVEsT0FDWixLQUNILE1BQU8sR0FBUSxPQUVaLElBQ0gsTUFBTyxHQUFRLE9BQ1osTUFDSCxNQUFPLEdBQVEsT0FFWixLQUNILE1BQU8sR0FBUSxPQUNaLElBQ0gsTUFBTyxHQUFRLE9BQ1osS0FDSCxNQUFPLEdBQVEsT0FDWixJQUNILE1BQU8sR0FBUSxPQUNaLEtBQ0gsTUFBTyxHQUFRLE9BQ1osSUFDSCxNQUFPLEdBQVEsT0FDWixJQUNILE1BQU8sR0FBUSxPQUNaLEtBQ0gsTUFBTyxHQUFRLE9BQ1osSUFDSCxNQUFPLEdBQVEsT0FDWixLQUNILE1BQU8sR0FBUSxPQUNaLElBQ0gsTUFBTyxHQUFRLE9BQ1osTUFDSCxNQUFPLEdBQVEsT0FDWixJQUNILE1BQU8sSUFBTyxPQUVYLElBQ0gsTUFBTyxJQUFNLEVBQUksWUFBYSxPQUUzQixPQUNILE1BQU8sR0FBUSxPQUNaLEtBQ0gsTUFBTyxHQUFRLEVBQVcsUUFFdkIsSUFDSCxNQUFPLEdBQVEsT0FDWixLQUNILE1BQU8sR0FBUSxPQUVaLFFBQ0EsSUFDSCxNQUFPLEdBQVEsT0FDWixNQUNILE1BQU8sSUFBTSxFQUFJLFNBQVMsUUFBUyxHQUFPLElBQVEsT0FD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 |